restful jax example ejemplo jersey jackson

jax - jersey maven



Usando Jackson como serializador de cliente Jersey (6)

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

Si es así, ¿cómo configurarlo?


Solución con JacksonJaxbJsonProvider

La forma más común de usar Jackson con configuración personalizada en el cliente de Jersey era utilizar JacksonJaxbJsonProvider por ejemplo, como este

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

Desafortunadamente en Jersey 2.26 copiaron la clase JacksonJaxbJsonProvider de com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider artifact (Jackson) a org.glassfish.jersey.media:jersey-media-json-jackson artifact (Jersey) y cambiaron paquete 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 la importación JacksonJaxbJsonProvider .

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

Mejor solución con ContextResolver<ObjectMapper>

Una mejor posibilidad de cómo configurar Jackson en el cliente de Jersey es usar de la misma manera que está configurado en el servidor de Jersey, que es crear un proveedor de ObjectMapper 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 el servidor y el cliente, puede reutilizar la clase ObjectMapperProvider .

Parece que este enfoque funciona desde Jersey versión 2.9.


Me encontré con un problema similar, pero para mí ninguna de las sugerencias dadas aquí funcionó. Lo que funcionó para mí fue debajo de una 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 idea de utilizar esta solución en este artículo: http://www.baeldung.com/jersey-jax-rs-client


OK, lo encontré, resultó ser bastante simple después de todo:

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

JacksonJsonProvider viene del paquete jackson-jaxrs.


Para jersey 2.22.2 y Jackson 2.7.2 dependencias 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 muestra 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


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

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


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