41

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

如果有怎么配置呢?

4

6 回答 6

62

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

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

JacksonJsonProvider 来自 jackson-jaxrs 包。

于 2010-04-05T18:45:13.763 回答
23

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

Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class)
于 2014-05-15T12:09:38.980 回答
11

解决方案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-providerartifact (Jackson)复制到org.glassfish.jersey.media:jersey-media-json-jacksonartifact (Jersey) 并将 package 从 更改com.fasterxml.jackson.jaxrs.jsonorg.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。

于 2018-09-14T19:52:15.760 回答
4

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

于 2011-08-26T01:09:25.170 回答
2

我遇到了类似的问题,但对我来说,这里给出的建议都没有奏效。对我有用的是下面的一段代码:

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

于 2017-09-27T18:11:26.693 回答
0

对于 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
于 2016-03-08T16:52:12.460 回答