Java CommonsMultipartFile的Jackson序列化问题
我有一个具有CommonMultipartFile类型字段的bean,如下所示:Java CommonsMultipartFile的Jackson序列化问题,java,json,serialization,jackson,Java,Json,Serialization,Jackson,我有一个具有CommonMultipartFile类型字段的bean,如下所示: public class Placement implements Serializable { private static final long serialVersionUID = 1L; private long placementId; private String type; private String placement; private transient CommonsMultipartFi
public class Placement implements Serializable {
private static final long serialVersionUID = 1L;
private long placementId;
private String type;
private String placement;
private transient CommonsMultipartFile fileData;
我已经将CommonsMultipartFile字段标记为transient,并尝试使用jackson库序列化为json。但出现以下错误:
org.codehaus.jackson.map.JsonMappingException: No serializer found for class java.io.ByteArrayInputStream and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: nextag.travel.dashboard.model.Placement["fileData"]->org.springframework.web.multipart.commons.CommonsMultipartFile["inputStream"])
任何帮助/建议都将不胜感激。不清楚Jackson是如何使用的,因为原始问题中没有提供代码或说明 默认情况下,Jackson在序列化期间跳过所有临时字段
import java.io.Serializable;
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.map.ObjectMapper;
public class Foo
{
public static void main(String[] args) throws Exception
{
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY));
System.out.println(mapper.writeValueAsString(new Placement()));
// output: {"placementId":42,"type":"OK","placement":"left"}
// transient fields are skipped by default
}
}
class Placement implements Serializable
{
private static final long serialVersionUID = 1L;
private long placementId = 42;
private String type = "OK";
private String placement = "left";
private transient CommonsMultipartFile fileData = new CommonsMultipartFile();
}
class CommonsMultipartFile
{
private String name = "Fred";
}
import java.io.Serializable;
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.map.ObjectMapper;
public class Foo
{
public static void main(String[] args) throws Exception
{
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY));
System.out.println(mapper.writeValueAsString(new Placement()));
// output: {"placementId":42,"type":"OK","placement":"left","fileData":{"name":"Fred"}}
// transient fields with getters are not skipped by default
}
}
class Placement implements Serializable
{
private static final long serialVersionUID = 1L;
private long placementId = 42;
private String type = "OK";
private String placement = "left";
private transient CommonsMultipartFile fileData = new CommonsMultipartFile();
public CommonsMultipartFile getFileData() {return fileData;}
}
class CommonsMultipartFile
{
private String name = "Fred";
}
但是,如果瞬态字段有一个getter,那么默认情况下Jackson会在序列化过程中包含它
import java.io.Serializable;
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.map.ObjectMapper;
public class Foo
{
public static void main(String[] args) throws Exception
{
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY));
System.out.println(mapper.writeValueAsString(new Placement()));
// output: {"placementId":42,"type":"OK","placement":"left"}
// transient fields are skipped by default
}
}
class Placement implements Serializable
{
private static final long serialVersionUID = 1L;
private long placementId = 42;
private String type = "OK";
private String placement = "left";
private transient CommonsMultipartFile fileData = new CommonsMultipartFile();
}
class CommonsMultipartFile
{
private String name = "Fred";
}
import java.io.Serializable;
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.map.ObjectMapper;
public class Foo
{
public static void main(String[] args) throws Exception
{
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY));
System.out.println(mapper.writeValueAsString(new Placement()));
// output: {"placementId":42,"type":"OK","placement":"left","fileData":{"name":"Fred"}}
// transient fields with getters are not skipped by default
}
}
class Placement implements Serializable
{
private static final long serialVersionUID = 1L;
private long placementId = 42;
private String type = "OK";
private String placement = "left";
private transient CommonsMultipartFile fileData = new CommonsMultipartFile();
public CommonsMultipartFile getFileData() {return fileData;}
}
class CommonsMultipartFile
{
private String name = "Fred";
}
跳过getter的一个配置选项是只应用@JsonIgnore注释
import java.io.Serializable;
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.ObjectMapper;
public class Foo
{
public static void main(String[] args) throws Exception
{
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY));
System.out.println(mapper.writeValueAsString(new Placement()));
// output: {"placementId":42,"type":"OK","placement":"left"}
// getters marked with @JsonIgnore are ignored
}
}
class Placement implements Serializable
{
private static final long serialVersionUID = 1L;
private long placementId = 42;
private String type = "OK";
private String placement = "left";
private transient CommonsMultipartFile fileData = new CommonsMultipartFile();
@JsonIgnore
public CommonsMultipartFile getFileData() {return fileData;}
}
class CommonsMultipartFile
{
private String name = "Fred";
}
如果不可能或不希望编辑原始类定义来添加@JsonIgnore注释,则可以使用
import java.io.Serializable;
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.ObjectMapper;
public class Foo
{
public static void main(String[] args) throws Exception
{
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY));
mapper.getSerializationConfig().addMixInAnnotations(Placement.class, SkipFileDataMixIn.class);
System.out.println(mapper.writeValueAsString(new Placement()));
// output: {"placementId":42,"type":"OK","placement":"left"}
// getters marked with @JsonIgnore are ignored
}
}
abstract class SkipFileDataMixIn
{
@JsonIgnore
public abstract CommonsMultipartFile getFileData();
}
class Placement implements Serializable
{
private static final long serialVersionUID = 1L;
private long placementId = 42;
private String type = "OK";
private String placement = "left";
private transient CommonsMultipartFile fileData = new CommonsMultipartFile();
public CommonsMultipartFile getFileData() {return fileData;}
}
class CommonsMultipartFile
{
private String name = "Fred";
}
另一种方法是使用@JsonIgnoreType
标记要跳过的类型
import java.io.Serializable;
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonIgnoreType;
import org.codehaus.jackson.map.ObjectMapper;
public class Foo
{
public static void main(String[] args) throws Exception
{
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY));
System.out.println(mapper.writeValueAsString(new Placement()));
// output: {"placementId":42,"type":"OK","placement":"left"}
// Types marked with @JsonIgnoreType are ignored during serialization.
}
}
class Placement implements Serializable
{
private static final long serialVersionUID = 1L;
private long placementId = 42;
private String type = "OK";
private String placement = "left";
private transient CommonsMultipartFile fileData = new CommonsMultipartFile();
public CommonsMultipartFile getFileData() {return fileData;}
}
@JsonIgnoreType
class CommonsMultipartFile
{
private String name = "Fred";
}
如果不想序列化多部分文件,请将注释
@JsonIgnore
添加到该字段
@JsonIgnore
private CommonsMultipartFile fileData;
您可以阅读更多abot jackson注释。如何公开私有字段?和getter一起?使用改进的可视性检测仪?你用什么代码来序列化?节省了我很多时间。。!!谢谢