2017-02-27 51 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