Jersey 2.6与Jackson JSON反序列化

Jersey 2.6与Jackson JSON反序列化,jersey,jackson,jersey-2.0,jersey-client,Jersey,Jackson,Jersey 2.0,Jersey Client,我的目标是进行web调用,并将返回的JSON转换为POJO。我正在尝试使用Jersey+Jackson,但在运行时遇到异常 我的maven pom文件包括以下依赖项- <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>2.6</vers

我的目标是进行web调用,并将返回的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>
但是下面的异常是抛出-

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。

您需要的是响应,而不是ClientResponse:

javax.ws.rs.core.Response jsonResponse = client.target(url).request(MediaType.APPLICATION_JSON).get();
然后,您可以看到您的响应是什么(这里调试是您的朋友)。这是某种类型的地图吗?如果是的话,你可以这样读

Map<SomeClassOfYours> entitiesFromResponse = jsonResponse.readEntity(new GenericType<Map<SomeClassOfYours>>() {});
编辑:为了使其工作,您还需要定义您的一些类,并将相应的字段、构造函数、getter和setter放在其中


Edit2:如果有疑问,您可以将jsonResponse作为
String.class
读取,并将其放入
String
变量中。

我最初尝试过这一点,但由于某些原因,我的IDE在响应对象(jsonResponse)中找不到readEntity。您还可以解释一下为什么我应该使用Response吗?我什么时候会使用ClientResponse?ClientResponse是jersey 1.x的遗物。看见当您尝试使用Response.readEntity()时,会出现什么样的错误?Netbeans显示了一个异常,表示方法readEntity不存在。但是查看源代码清楚地显示了该方法。代码已编译,但在运行时出现错误,表示该方法不存在。后来我将JavaEEWebAPI从版本6更新到了版本7,现在readEntity可以正常工作。谢谢。
client.target(url).request(MediaType.APPLICATION\u JSON).get(YourClass.class)
可能更直观一些?如果你也稍微解释一下你的解决方案,答案总是更有力。@Magnilex的想法是使用泛型,包装在javax.ws.rs.core.Response中,用于在应用程序的后端和前端部分之间来回交换类型化实例。很好。:)如果我是你,我会编辑问题并添加解释。
Response jsonResponse = getClient().target(URI).request().get();
T result = jsonResponse.readEntity(type);
SomeClassOfYours entityFromResponse = jsonResponse.readEntity(SomeClassOfYours.class);
Response jsonResponse = getClient().target(URI).request().get();
T result = jsonResponse.readEntity(type);