使用Jackson作为Jersey客户端序列化程序
在使用Jersey客户端API时,是否可以使用Jackson作为JSON数据的序列化器/封送器,而不是JAXB使用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
如果是这样的话,如何配置它?好的,我发现了,它毕竟很简单:
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提供程序?救了我的命:)。我一直在寻找解决方案,时间比我愿意承认的要长,这很有效!!非常适合我,非常感谢。