2017-02-27 79 views
1

我有一個客戶端應用程序,我正在使用它來使用某些API並對其進行更新。我將Jersey 2.25.1與Jersey Jackson一起使用,沒有自定義連接器,只是基本設置。在運行時更新Jersey Jackson的Mapper配置

我有一個POJO,我正在序列化使用傑克遜和澤西島,但我需要這個POJO序列化有兩種方式,第一個是包括所有空值,而序列化他們,第二個是忽略和刪除空字段。

這就是API的工作方式,所以API不能改變(它不是我的API),所以我問我可以在運行時更新Jersey Jackson Mapper嗎?

我所尋找的是這樣的:

Client client = ClientBuilder.newBuilder() 
      .register(JacksonFeature.class) 
      .build(); 
client.getJacksonObjectMapper().setSerializationInclusion(Include.NON_NULL); 

回答

1

您可以使用ContextResolver,並配置ObjectMapper那裏。傑克遜提供商將調用上下文解析器以獲得ObjectMapper

class JacksonResolver implements ContextResolver<ObjectMapper> { 
    private final ObjectMapper mapper = new ObjectMapper(); 

    public JacksonResolver() { 
     // configure mapper 
    } 

    @Override 
    public ObjectMapper resolve(Class<?> cls) { 
     return this.mapper; 
    } 
} 

Client client = ClientBuilder.newBuilder() 
     .register(JacksonFeature.class) 
     .register(new JacksonResolver()) 
     .build(); 
+0

這可以在客戶端創建後完成嗎?我的意思是在運行時有條件嗎? – engma

+0

不可以。您將獲得的最佳模型是每個模型類。被序列化的類被傳遞給'getContext'方法,並且你可以有條件地決定在那裏使用哪個映射器,但是事實就是如此。除此之外,映射器實際上不應該像這樣在條件基礎上配置,因爲它的配置不是線程安全的。您可能只需爲不同的場景創建不同的客戶端。 –

+0

是的,好像我需要創建另一個客戶端然後@peeskillet – engma