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

使用Jackson作为Jersey客户端序列化程序,jersey,jackson,Jersey,Jackson,在使用Jersey客户端API时,是否可以使用Jackson作为JSON数据的序列化器/封送器,而不是JAXB 如果是这样的话,如何配置它?好的,我发现了,它毕竟很简单: ClientConfig cc = new DefaultClientConfig(); cc.getClasses().add(JacksonJsonProvider.class); Client clientWithJacksonSerializer = Client.create(cc); JacksonJsonPro

在使用Jersey客户端API时,是否可以使用Jackson作为JSON数据的序列化器/封送器,而不是JAXB


如果是这样的话,如何配置它?

好的,我发现了,它毕竟很简单:

ClientConfig cc = new DefaultClientConfig();
cc.getClasses().add(JacksonJsonProvider.class);
Client clientWithJacksonSerializer = Client.create(cc);

JacksonJsonProvider来自jackson jaxrs包。

您可能还想尝试
org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider(jackson jaxrs 1.6.1)

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

Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class)

对于泽西岛2.22.2和杰克逊2.7.2而言,gradle依赖性为:

dependencies {
    compile("com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.7.2")
    compile("org.glassfish.jersey.core:jersey-client:2.22.2")
}
示例客户端代码为:

final String    name    = "world";
final Client    client  = ClientBuilder.newClient().register(JacksonJaxbJsonProvider.class);
final WebTarget target  = client.target("http://localhost:8080").path("hello").path(name);
final Message   message = target.request().get(Message.class);

System.out.println(message.getWelcomeMessage()); // hello world

我遇到了类似的问题,但对我来说,这里给出的任何建议都不起作用。 对我有用的是下面的代码:

import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Client;
...

ClientBuilder clientBuilder = ClientBuilder.newBuilder()
clientBuilder.register(JacksonFeature.class);
...
Client client = clientBuilder.build();
关键的变化是使用了
JacksonFeature.class
——它来自
jersey-media-json-jackson-x.yy.jar

我从本文中获得了使用此解决方案的线索-

使用
JacksonJaxbJsonProvider的解决方案
在Jersey客户端中使用Jackson进行自定义配置的常用方法是使用
JacksonJaxbJsonProvider
,例如

JacksonJaxbJsonProvider provider=新的JacksonJaxbJsonProvider();
setMapper(yourObjectMapper());
Client Client=ClientBuilder.newClient(新ClientConfig(provider));
不幸的是,在泽西岛2.26中,他们复制了JacksonJaxbJsonProvider类 来自
com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider
artifact(jackson) 到
org.glassfish.jersey.media:jersey-media-json-jackson
artifact(jersey) 换了包 来自
com.fasterxml.jackson.jaxrs.json
转到
org.glassfish.jersey.jackson.internal.jackson.jaxrs.json

仍然可以使用这种方法,只需更改
JacksonJaxbJsonProvider
import即可

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

使用
ContextResolver提供更好的解决方案
在Jersey客户端中配置Jackson的更好方法是使用Jersey服务器中配置Jackson的相同方法,即创建
ObjectMapper
提供程序,如下所示:

@Provider
@产生(MediaType.APPLICATION_JSON)
公共类ObjectMapperProvider实现ContextResolver{
私有ObjectMapper ObjectMapper=yourObjectMapper();
@凌驾
公共对象映射器getContext(类objectType){
返回对象映射器;
}
}
举个例子:

ClientConfig ClientConfig=new ClientConfig();
clientConfig.register(JacksonFeature.class);//通常是自动发现的
register(新的ObjectMapperProvider());
Client Client=ClientBuilder.newClient(clientConfig);
如果同时拥有服务器和客户端,则可以重用
ObjectMapperProvider
class


这种方法似乎适用于Jersey 2.9版。

有趣的问题:我还没有使用客户端API。你问过这件事吗?肯定可以插入消息读取器/写入器,Jackson jax rs插件实现这些接口。StaxMan,Jersey客户端API不是jax-rs规范的一部分。但是您的权利,我应该首先尝试询问泽西岛邮件列表。对于最近的泽西岛版本,如2.26,请参见下面的我的答案。@landon9720,因为它支持JAXB注释以及默认的Jackson注释。另请参见下面的swist答案,更简单的是,它现在是jackson jaxrs json提供程序包,带有较新版本的jackson。有没有一种方法可以“自动发现”jacksonjson提供程序?救了我的命:)。我一直在寻找解决方案,时间比我愿意承认的要长,这很有效!!非常适合我,非常感谢。