Jackson serialization issue with CommonsMultipartFile

I have a bean with a CommonsMultipartFile field, for example:

public class Placement implements Serializable { private static final long serialVersionUID = 1L; private long placementId; private String type; private String placement; private transient CommonsMultipartFile fileData; 

I put the CommonsMultipartFile field as transient and tried to serialize json using the jackson library. But getting the following error:

 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"]) 

Any help / suggestions would be greatly appreciated.

+4
source share
2 answers

It is unclear how Jackson is used, since no code or description was provided in the original question.

By default, Jackson skips all transition fields during serialization.

 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"; } 

However, if there is a metter for the transition field, then by default Jackson turns it on during serialization.

 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"; } 

One configuration option to skip the getter is to simply apply the @JsonIgnore annotation.

 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"; } 

If this is not possible or it is desirable to change the original class definition to add @JsonIgnore annotation, you can use Mix-In .

 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"; } 

Another approach is to mark the type you want to skip using @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"; } 
+5
source

If you do not want to serialize multipartfile, add the @JsonIgnore annotation to the field.

 @JsonIgnore private CommonsMultipartFile fileData; 

You can read more abot jackson annotations here .

+4
source

All Articles