JacksonJaxbJsonProvider 的解决方案
在 Jersey 客户端中使用 Jackson 和自定义配置的常用方法是使用 JacksonJaxbJsonProvider,例如这样
JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider();
provider.setMapper(yourObjectMapper());
Client client = ClientBuilder.newClient(new ClientConfig(provider));
不幸的是,他们在 Jersey 2.26 中复制了 JacksonJaxbJsonProvider 类
来自com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider神器(杰克逊)
到org.glassfish.jersey.media:jersey-media-json-jackson神器(球衣)
并更改了包装
来自com.fasterxml.jackson.jaxrs.json
到org.glassfish.jersey.jackson.internal.jackson.jaxrs.json。
这种方式还是可以用的,只需要改JacksonJaxbJsonProviderimport即可。
除了JacksonJaxbJsonProvider 现在在internal 包中的缺点也是
你必须知道你的代码在哪个 Jersey 版本上运行,当不同的依赖项需要不同的 Jersey 版本时,这可能是一个问题。
ContextResolver<ObjectMapper> 的更好解决方案
如何在 Jersey client 中配置 Jackson 的更好方法是使用在 Jersey server 中配置 Jackson 的相同方式,即创建 ObjectMapper 提供程序,如下所示:
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
private ObjectMapper objectMapper = yourObjectMapper();
@Override
public ObjectMapper getContext(Class<?> objectType) {
return objectMapper;
}
}
并像这样使用它:
ClientConfig clientConfig = new ClientConfig();
clientConfig.register(JacksonFeature.class); // usually auto-discovered
clientConfig.register(new ObjectMapperProvider());
Client client = ClientBuilder.newClient(clientConfig);
如果您同时拥有服务器和客户端,则可以重用 ObjectMapperProvider 类。
似乎这种方法适用于 Jersey 2.9 版。