tutorial jax example json jersey jackson jax-rs jersey-client

json - example - ¿Cómo extraer ObjectMapper del cliente JAX-RS?



javax ws rs client (3)

Jersey no configura explícitamente una instancia de ObjectMapper, sino que delega a JacksonJsonProvider , que a su vez utiliza una instancia de mapeador predeterminada. Puede rastrear a través del código JacksonProviderProxy para ver cómo funciona. Puede crear y personalizar un asignador compartido para usar en su aplicación definiendo un solucionador de contexto :

@Provider public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> { private ObjectMapper mapper = null; public ObjectMapperContextResolver() { super(); // Illustrate configuration of the mapper instance mapper = new ObjectMapper().configure( SerializationConfig.Feature.WRAP_ROOT_VALUE, true).configure( DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, true); } @Override public ObjectMapper getContext(Class<?> type) { return mapper; } }

El proveedor de Jackson recuperará su instancia de mapeador de esta resolución, y usted podría hacer lo mismo en su código, así:

public class MyResource { @Context private ContextResolver<ObjectMapper> mapperResolver; public void someResourceMethod() { final ObjectMapper mapper = mapperResolver.getContext(Object.class); } }

Estoy usando el cliente Jersey JAX-RS (versión 2.0). Sé que está usando un ObjectMapper Jackson para generar y analizar JSON. Quiero usar ese mismo objeto para generar JSON para algunas clases de Java para que pueda escribirlas en un registro.

Sé que puedo crear una nueva instancia de ObjectMapper, pero prefiero solicitar a Jersey Client que me proporcione una referencia a la que está utilizando. ¿Cómo puedo hacer esto? Jersey 2.0 conoce a Jackson porque, en primer lugar, incluye una clase JacksonFeature que se utiliza para configurar la función Jackson.


Lo resolví agregando los siguientes miembros estáticos:

private static JacksonJsonProvider jackson_json_provider = new JacksonJaxbJsonProvider() .configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false) .configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false); private static ObjectMapper object_mapper = jackson_json_provider.locateMapper( Object.class, MediaType.APPLICATION_JSON_TYPE); private static Client client = ClientBuilder.newClient().register(jackson_json_provider);

Tenga en cuenta que la segunda declaración no es necesaria solo para configurar FAIL_ON_UNKNOWN_PROPERTIES o FAIL_ON_EMPTY_BEANS ; Uso object_mapper por otros motivos.


No fue posible acceder al mapeador de objetos de jersey para configurarlo, según las otras soluciones aquí (usando Jackson 2.8.3). (Sospecho que puede estar relacionado con el contenedor de osgi, pero de todos modos ...) Una manera de evitarlo es obtener el objeto de respuesta del cliente e invocar su propia instancia de ObjectMapper en él. Luego, esa misma instancia se puede reutilizar con su configuración explícita en otros lugares también.

Client client = ClientBuilder.newClient(); ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); ... Response r = client.target(URL).request().get(); MyDtoClass dto = mapper.readValue((InputStream)(r.getEntity()), MyDtoClass.class);