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?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top