2014-04-08 47 views
1

傑克遜自定義序列我需要定製在傑克遜POJO的序列化,這樣我可以在基於用戶輸入具有過濾

屬性應用於濾波器我施加在POJO以下注釋。

@JsonFilter("userFilter") 
@JsonSerialize(using = UserSerializer.class) 

自定義序列化器類如下所示。

public class UserSerializer extends JsonSerializer<User> { 


    @Override 
    public void serialize(User value, JsonGenerator jgen, 
      SerializerProvider provider) throws IOException, 
      JsonProcessingException { 

     ObjectMapper mapper = new ObjectMapper(); 
     SimpleFilterProvider sfp = new SimpleFilterProvider(); 

     // create a set that holds name of User properties that must be serialized 
     Set userFilterSet = new HashSet<String>(); 
     userFilterSet.add("firstName"); 
     userFilterSet.add("corporateOrgs"); 
     userFilterSet.add("rights"); 
     userFilterSet.add("requirements"); 


     sfp.addFilter("userFilter",SimpleBeanPropertyFilter.filterOutAllExcept(userFilterSet)); 

     // create an objectwriter which will apply the filters 
     ObjectWriter writer = mapper.writer(sfp); 

     String json = writer.writeValueAsString(value); 


    } 

} 

我可以看到,傑克遜正試圖使用​​定義的自定義序列化程序來序列化POJO。然而,它會以無限遞歸/ stackoverflow結束,因爲writer.writeValueAsString(value)最終會再次調用自定義序列化程序。

顯然我在這裏沒有得到一些基本的東西。如果過濾是在序列化方法之外完成的(例如從main()調用的方法),則過濾按預期工作。

任何人都可以請提供洞察力/鏈接文檔如何使用自定義序列化利用過濾。

回答

0

您應該在您的示例中使用MixIn功能。簡單的用法:現在

@JsonSerialize(using = UserSerializer.class) 
interface UserMixIn { 

} 

,在main方法,你可以通過這種方式使自定義序列:

public static void main(String[] args) throws Exception { 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.addMixInAnnotations(User.class, UserMixIn.class); 
    System.out.println(mapper.writeValueAsString(new User())); 
} 

ObjectMapper不知道自定義序列,它會使用默認的序列。這樣可以避免StackOverflow異常。

+0

我按照建議試過 – user3509599