2011-07-22 63 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