使用 Jersey 客户端 API 时,是否可以使用 Jackson 作为 JSON 数据的序列化器/编组器而不是 JAXB?
如果有怎么配置呢?
好的,我发现了,毕竟它很简单:
ClientConfig cc = new DefaultClientConfig();
cc.getClasses().add(JacksonJsonProvider.class);
Client clientWithJacksonSerializer = Client.create(cc);
JacksonJsonProvider 来自 jackson-jaxrs 包。
您可以跳过外部配置的创建并直接注册提供程序:
Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class)
JacksonJaxbJsonProvider
如何在 Jersey 客户端中使用 Jackson 和自定义配置的常用方法是使用JacksonJaxbJsonProvider
例如这样
JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider();
provider.setMapper(yourObjectMapper());
Client client = ClientBuilder.newClient(new ClientConfig(provider));
不幸的是,在Jersey 2.26JacksonJaxbJsonProvider
中,他们将class 从com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider
artifact (Jackson)复制到org.glassfish.jersey.media:jersey-media-json-jackson
artifact (Jersey) 并将 package 从 更改com.fasterxml.jackson.jaxrs.json
为org.glassfish.jersey.jackson.internal.jackson.jaxrs.json
.
仍然可以使用这种方法,只需要更改JacksonJaxbJsonProvider
导入即可。
除了JacksonJaxbJsonProvider
现在在internal
包中之外,您还必须知道您的代码在哪个 Jersey 版本上运行,当不同的依赖项需要不同的 Jersey 版本时,这可能是一个问题。
ContextResolver<ObjectMapper>
如何在 Jersey客户端中配置 Jackson 的更好方法是使用在 Jersey服务器中配置 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。
您可能还想尝试org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider (jackson-jaxrs 1.6.1)
。
我遇到了类似的问题,但对我来说,这里给出的建议都没有奏效。对我有用的是下面的一段代码:
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
我从这篇文章中得到了使用这个解决方案的线索 - http://www.baeldung.com/jersey-jax-rs-client
对于 jersey 2.22.2和 Jackson 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