Использование Джексона в качестве клиентского сериализатора Джерси - PullRequest
35 голосов
/ 21 марта 2010

Можно ли использовать Джексона в качестве сериализатора / маршаллера для данных JSON вместо JAXB при использовании Jersey Client API?

Если да, то как это настроить?

Ответы [ 6 ]

56 голосов
/ 05 апреля 2010

ОК, я это выяснил, все-таки получается довольно просто:

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

JacksonJsonProvider поставляется из пакета jackson-jaxrs.

17 голосов
/ 15 мая 2014

Вы можете пропустить создание внешнего конфига и напрямую зарегистрировать провайдера:

Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class)
6 голосов
/ 14 сентября 2018

Решение с JacksonJaxbJsonProvider

Распространенным способом использования Джексона с пользовательской конфигурацией в клиенте Джерси было использование 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 артефакта (Джексон) в org.glassfish.jersey.media:jersey-media-json-jackson артефакт (Джерси) и изменили пакет с com.fasterxml.jackson.jaxrs.json на org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.

Это все еще возможноиспользуйте этот подход, просто нужно изменить JacksonJaxbJsonProvider import.

Помимо JacksonJaxbJsonProvider, присутствующего в internal недостатком пакета является также то, что вы должны знать, на какой версии Jersey работает ваш код, что может быть проблемойкогда разные зависимости требуют разных версий Джерси.

Лучшее решение с 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.

4 голосов
/ 26 августа 2011

Вы также можете попробовать org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider (jackson-jaxrs 1.6.1).

1 голос
/ 27 сентября 2017

Я столкнулся с подобной проблемой, но для меня ни одно из приведенных здесь предложений не сработало. То, что работало для меня, было ниже части кода:

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

0 голосов
/ 08 марта 2016

Для Джерси 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
...