带有 Jackson JSON 反序列化的 Jersey 2.6

标签 jersey jackson jersey-2.0 jersey-client

我的目标是进行网络调用并将返回的 JSON 转换为 POJO。我正在尝试为此使用 Jersey+Jackson,但在运行时遇到异常。

我的 maven pom 文件包含以下依赖项 -

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

我用来获取一些数据的代码如下 -
Client client = ClientBuilder.newBuilder()
            .register(JacksonFeature.class)
            .build();
ClientResponse response = client.target(url).request(MediaType.APPLICATION_JSON).get(ClientResponse.class);

但抛出以下异常 -
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

我是否缺少一些设置以使其正常工作?
我已经通过 curl 和浏览器尝试了 url,它按预期返回 JSON。

最佳答案

您需要的是响应而不是客户端响应:

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

然后您可以看到您的响应中的内容(调试是您的 friend )。它是某种类型的 map 吗?如果是,您可以通过执行例如阅读它
Map<SomeClassOfYours> entitiesFromResponse = jsonResponse.readEntity(new GenericType<Map<SomeClassOfYours>>() {});

如果您在响应中放置了一个普通实体,您可以简单地执行以下操作:
SomeClassOfYours entityFromResponse = jsonResponse.readEntity(SomeClassOfYours.class);

编辑:为此,您还需要定义 SomeClassOfYours 并将相应的字段、构造函数、getter 和 setter 放在那里。

Edit2:如有疑问,您始终可以将 jsonResponse 读取为 String.class并将其放入 String多变的。

关于带有 Jackson JSON 反序列化的 Jersey 2.6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21918081/

相关文章:

每次我调用休息电话时,Spring/Jersey 都会创建新的服务对象

spring - Java Spring Jackson 日期序列化

java - 使用 Jackson 序列化类时添加类型信息,以便可以使用接口(interface)类型反序列化而不使用注释?

java - Jersey ResourceConfig 不会自动发现但应用程序会自动发现吗?

java - 在 Json 中显示零值

jersey - ExceptionMapper 如何在 EVERREST 中与 JAX-RS 一起工作?

java - 从 Jersey 调用@POST

java - Jersey 客户端,当使用 Maven 执行应用程序时使用 JAXBContext,但不使用 java -jar

jackson - 使用 jackson 忽略 JSON 对象上的未知字段

web-services - Jackson 不使用 JSON 根元素