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?
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.
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)
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)
.
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
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
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.
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