Usando Jackson como serializador de clientes de Jersey


¿Es posible usar Jackson como serializador/marshaller para datos JSON en lugar de JAXB cuando se usa Jersey Client API?

Si es así, ¿cómo configurarlo?

Author: Maciej Biłas, 2010-03-21

6 answers

OK, lo descubrí, resulta ser bastante simple después de todo:

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

El JacksonJsonProvider viene del paquete jackson-jaxrs.

 55
Author: Maciej Biłas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-05 18:45:13

Puede omitir la creación de configuración externa y registrar el proveedor directamente:

Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class)
 17
Author: swist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-15 12:09:38

Es posible que también desee probar org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider (jackson-jaxrs 1.6.1).

 4
Author: sparkle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-01 23:03:20

Me encontré con un tema similar, pero para mí ninguna de las sugerencias dadas aquí funcionó. Lo que funcionó para mí estaba por debajo de la pieza de código:

import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Client;
...

ClientBuilder clientBuilder = ClientBuilder.newBuilder()
clientBuilder.register(JacksonFeature.class);
...
Client client = clientBuilder.build();

El cambio clave fue el uso de JacksonFeature.class - viene de jersey-media-json-jackson-x.yy.jar

Tengo una pista para usar esta solución de este artículo - http://www.baeldung.com/jersey-jax-rs-client

 1
Author: Wand Maker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-27 18:11:26

Para jersey 2.22.2 y Jackson 2.7.2 las dependencias de gradle son:

dependencies {
    compile("com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.7.2")
    compile("org.glassfish.jersey.core:jersey-client:2.22.2")
}

El código de ejemplo del cliente es:

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
 0
Author: Fırat KÜÇÜK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-08 16:52:12

Solución con JacksonJaxbJsonProvider

La forma común de usar Jackson con configuración personalizada en Jersey client era usar JacksonJaxbJsonProvider por ejemplo, así

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

Desafortunadamente en Jersey 2.26 copiaron la clase JacksonJaxbJsonProvider desde com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider artefacto (Jackson) a org.glassfish.jersey.media:jersey-media-json-jackson artefacto (Jersey) y paquete cambiado de com.fasterxml.jackson.jaxrs.json a org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.

Todavía es posible utilizar este enfoque solo es necesario cambiar JacksonJaxbJsonProvider importación.

Aparte de que JacksonJaxbJsonProvider está ahora en el paquete internal el inconveniente también es que debe saber en qué versión de Jersey se ejecuta su código, lo que podría ser un problema cuando diferentes dependencias requieren diferentes versiones de Jersey.

Mejor solución con ContextResolver<ObjectMapper>

Mejor posibilidad de cómo configurar Jackson en Jersey cliente es utilizar la misma forma en que se configura en Jersey servidor que es crear ObjectMapper proveedor como este:

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {

    private ObjectMapper objectMapper = yourObjectMapper();

    @Override
    public ObjectMapper getContext(Class<?> objectType) {
        return objectMapper;
    }

}

Y úsalo por ejemplo así:

ClientConfig clientConfig = new ClientConfig();
clientConfig.register(JacksonFeature.class);  // usually auto-discovered
clientConfig.register(new ObjectMapperProvider());
Client client = ClientBuilder.newClient(clientConfig);

Si tiene tanto el servidor como el cliente pueden reutilizar la clase ObjectMapperProvider.

Parece que este enfoque funciona a partir de la versión 2.9 de Jersey.

 0
Author: Vojta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-14 19:52:15