使用Jackson作为Jersey客户端序列化器

Mac*_*łas 36 jersey jackson

在使用Jersey Client API时,是否可以使用Jackson作为JSON数据的序列化程序/编组程序而不是JAXB?

如果是这样如何配置呢?

Mac*_*łas 57

好的,我发现了,毕竟事实证明这很简单:

ClientConfig cc = new DefaultClientConfig();
cc.getClasses().add(JacksonJsonProvider.class);
Client clientWithJacksonSerializer = Client.create(cc);
Run Code Online (Sandbox Code Playgroud)

JacksonJsonProvider来自jackson-jaxrs包.

  • 它现在是jackson-jaxrs-json-provider软件包,带有更新版本的jackson. (2认同)

swi*_*ist 17

您可以跳过创建外部配置并直接注册提供程序:

Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class)
Run Code Online (Sandbox Code Playgroud)


Voj*_*jta 6

解决方案 JacksonJaxbJsonProvider

如何在Jersey客户端中使用自定义配置使用Jackson的常见方法是使用JacksonJaxbJsonProvider像这样的示例

JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider();
provider.setMapper(yourObjectMapper());
Client client = ClientBuilder.newClient(new ClientConfig(provider));
Run Code Online (Sandbox Code Playgroud)

不幸的是,在Jersey 2.26中,他们将JacksonJaxbJsonProvider类从com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider工件(Jackson)复制到org.glassfish.jersey.media:jersey-media-json-jackson工件(Jersey),并将包从更改com.fasterxml.jackson.jaxrs.jsonorg.glassfish.jersey.jackson.internal.jackson.jaxrs.json

仍然可以使用只需要更改JacksonJaxbJsonProvider导入的这种方法。

除了JacksonJaxbJsonProvider现在处于internal软件包之外,缺点还在于您还必须知道代码在哪个Jersey版本上运行,当不同的依赖项需要不同的Jersey版本时,这可能是一个问题。

更好的解决方案 ContextResolver<ObjectMapper>

在Jersey 客户端中配置Jackson的更好方法是使用与在Jersey 服务器中配置ObjectMapper提供商的方式相同的方式,该方式将创建提供者,如下所示:

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {

    private ObjectMapper objectMapper = yourObjectMapper();

    @Override
    public ObjectMapper getContext(Class<?> objectType) {
        return objectMapper;
    }

}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

ClientConfig clientConfig = new ClientConfig();
clientConfig.register(JacksonFeature.class);  // usually auto-discovered
clientConfig.register(new ObjectMapperProvider());
Client client = ClientBuilder.newClient(clientConfig);
Run Code Online (Sandbox Code Playgroud)

如果您同时拥有服务器和客户端,则可以重用ObjectMapperProvider类。

看来此方法在Jersey 2.9版中有效。