restful jax example ejemplo clientbuilder jersey jackson jersey-2.0 jersey-client

jax - Jersey 2.6 con deserialización Jackson JSON



jersey maven (2)

Lo que necesita es una Respuesta y no una Respuesta Cliente:

javax.ws.rs.core.Response jsonResponse = client.target(url).request(MediaType.APPLICATION_JSON).get();

Entonces puedes ver lo que viene en tu respuesta (la depuración es tu amigo aquí). ¿Es por casualidad un mapa de algún tipo? Si es así, puedes leer haciendo, por ejemplo,

Map<SomeClassOfYours> entitiesFromResponse = jsonResponse.readEntity(new GenericType<Map<SomeClassOfYours>>() {});

Si ha puesto una entidad normal en la respuesta, simplemente puede hacer algo como:

SomeClassOfYours entityFromResponse = jsonResponse.readEntity(SomeClassOfYours.class);

Editar: Para que esto funcione también necesitarás definir SomeClassOfYours y poner los campos correspondientes, constructor, getters y setters allí.

Edit2: cuando tenga dudas, siempre puede leer el jsonResponse como String.class y ponerlo en una variable String .

Mi objetivo es hacer llamadas web y convertir JSON devuelto a POJO. Intento usar Jersey + Jackson para esto pero obtengo excepciones cuando corro.

Mi archivo maven pom incluye las siguientes dependencias:

<dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>2.6</version> </dependency>

El código que utilizo para buscar algunos datos es el siguiente:

Client client = ClientBuilder.newBuilder() .register(JacksonFeature.class) .build(); ClientResponse response = client.target(url).request(MediaType.APPLICATION_JSON).get(ClientResponse.class);

Pero la siguiente excepción es throw -

javax.ws.rs.ProcessingException: Error reading entity from input stream. at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:868) at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:785) at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:335) ... ... Caused by: org.codehaus.jackson.map.JsonMappingException: Can not find a deserializer for non-concrete Map type [map type; class javax.ws.rs.core.MultivaluedMap, [simple type, class java.lang.String] -> [collection type; class java.util.List, contains [simple type, class java.lang.String]]] at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCache2(StdDeserializerProvider.java:315) at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCacheValueDeserializer(StdDeserializerProvider.java:290) at org.codehaus.jackson.map.deser.StdDeserializerProvider.findValueDeserializer(StdDeserializerProvider.java:159) at org.codehaus.jackson.map.deser.std.StdDeserializer.findDeserializer(StdDeserializer.java:620) at org.codehaus.jackson.map.deser.BeanDeserializer.resolve(BeanDeserializer.java:379) at org.codehaus.jackson.map.deser.StdDeserializerProvider._resolveDeserializer(StdDeserializerProvider.java:407) at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCache2(StdDeserializerProvider.java:352) at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCacheValueDeserializer(StdDeserializerProvider.java:290) at org.codehaus.jackson.map.deser.StdDeserializerProvider.findValueDeserializer(StdDeserializerProvider.java:159) at org.codehaus.jackson.map.deser.StdDeserializerProvider.findTypedValueDeserializer(StdDeserializerProvider.java:180) at org.codehaus.jackson.map.ObjectMapper._findRootDeserializer(ObjectMapper.java:2829) at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2699) at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1315) at org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:419) at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:257) at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:229) at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:149) at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1124) at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:853) ... 90 more Caused by: java.lang.IllegalArgumentException: Can not find a deserializer for non-concrete Map type [map type; class javax.ws.rs.core.MultivaluedMap, [simple type, class java.lang.String] -> [collection type; class java.util.List, contains [simple type, class java.lang.String]]] at org.codehaus.jackson.map.deser.BasicDeserializerFactory.createMapDeserializer(BasicDeserializerFactory.java:424) at org.codehaus.jackson.map.deser.StdDeserializerProvider._createDeserializer(StdDeserializerProvider.java:380) at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCache2(StdDeserializerProvider.java:310) ... 108 more

¿Me falta algo de configuración para que esto funcione? He probado la URL a través de curl y navegador y devuelve JSON como se esperaba.


Response jsonResponse = getClient().target(URI).request().get(); T result = jsonResponse.readEntity(type);