El uso de Jackson como serializador cliente Jersey
Pregunta
¿Es posible el uso de Jackson como el serializador / contador de referencias para los datos de JSON en lugar de JAXB al utilizar la API de cliente Jersey?
Si es así cómo configurarlo?
Solución
OK, lo descubrí, que 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 de Jackson-jaxrs.
Otros consejos
Es posible omitir la creación de configuración externa y registrar el proveedor directamente:
Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class)
Solución con JacksonJaxbJsonProvider
La manera más común cómo utilizar 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));
Por desgracia, en Jersey 2.26 se copian clase JacksonJaxbJsonProvider
de artefacto com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider
(Jackson)
a org.glassfish.jersey.media:jersey-media-json-jackson
artefacto (Jersey)
y el paquete modificado
de com.fasterxml.jackson.jaxrs.json
a org.glassfish.jersey.jackson.internal.jackson.jaxrs.json
.
Todavía es posible utilizar este enfoque es sólo necesitaba cambiar importación JacksonJaxbJsonProvider
.
Además de JacksonJaxbJsonProvider
estar ahora en internal
paquete inconveniente es también
que usted debe saber de qué versión de Jersey se ejecuta el código que podría ser un problema cuando diferentes dependencias requieren diferentes versiones Jersey.
Una mejor solución con ContextResolver<ObjectMapper>
Una mejor posibilidad de cómo configurar Jackson en Jersey cliente es el uso de la misma manera cómo está configurado en Jersey servidor , que es la creación de proveedor de ObjectMapper
como esto:
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
private ObjectMapper objectMapper = yourObjectMapper();
@Override
public ObjectMapper getContext(Class<?> objectType) {
return objectMapper;
}
}
y usarlo por ejemplo como sigue:
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 se puede volver a utilizar la clase ObjectMapperProvider
.
Parece que este enfoque funciona desde Jersey versión 2.9.
También es posible que desee probar org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider (jackson-jaxrs 1.6.1)
.
Me encontré con problema similar, pero para mí ninguna de las sugerencias que se dan aquí trabajé. Lo que funcionó para mí fue inferior trozo 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
- se trata de jersey-media-json-jackson-x.yy.jar
Tengo idea de utilizar esta solución de este artículo - http: // www. baeldung.com/jersey-jax-rs-client
Para Jersey 2.22.2 y Jackson 2.7.2 Gradle dependencias son:
dependencies {
compile("com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.7.2")
compile("org.glassfish.jersey.core:jersey-client:2.22.2")
}
código de cliente de la muestra 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