是否有可能使用Jersey客户端API时使用杰克逊作为JSON数据,而不是JAXB串行器/编组?

如果这样如何配置它?

有帮助吗?

解决方案

OK,我发现它了,它原来是很简单毕竟:

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

在JacksonJsonProvider来自杰克逊JAXRS包。

其他提示

您可以直接跳到外部配置的创建和注册该提供:

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

JacksonJaxbJsonProvider溶液

如何使用杰克逊与Jersey客户端定制的配置

常见方法是使用JacksonJaxbJsonProvider例如像这样的

JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider();
provider.setMapper(yourObjectMapper());
Client client = ClientBuilder.newClient(new ClientConfig(provider));

不幸的是在<强>泽西2.26 它们复制JacksonJaxbJsonProvider类 从com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider伪影(Jackson)的 到org.glassfish.jersey.media:jersey-media-json-jackson神器(新泽西州) 并且更改后的包 从com.fasterxml.jackson.jaxrs.jsonorg.glassfish.jersey.jackson.internal.jackson.jaxrs.json

但仍可以使用这种方法,它只是需要改变JacksonJaxbJsonProvider进口。

除了JacksonJaxbJsonProviderinternal现在正在封装的缺点是也 你必须知道哪个版本泽西你的代码运行时具有不同的相关要求不同版本的球衣,这可能是一个问题。

更好地与ContextResolver<ObjectMapper>溶液

更好的可能性,如何在新泽西州的配置杰克逊客户的就是用同样的方式它是如何在新泽西州的配置的服务器的是要创建这样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类。

看来,这种做法从泽西岛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

有关的球衣的 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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top