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