2011-07-22 62 views
4

我有CommonsMultipartFile类型字段一个bean,像这样:杰克逊序列化问题与CommonsMultipartFile

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领域为瞬态,并试图利用序列杰克逊库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"]) 

任何帮助/建议将不胜感激。

+0

你如何公开私人领域?有getters?使用修改后的VisibilityChecker?你用什么代码来序列化? –

回答

5

目前还不清楚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"; 
} 

一个配置选项来跳过吸气剂是只适用@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,一个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"; 
} 

另一种方法是标记与@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"; 
} 
+0

为我节省了很多时间..!谢谢 – user3765370

4

如果你不想要序列,则multipartfile注释@JsonIgnore添加到字段。

@JsonIgnore 
private CommonsMultipartFile fileData; 

你可以阅读更多的ABOT杰克逊注释here