【问题标题】:Error when trying to convert JSON to POJO using Jersey尝试使用 Jersey 将 JSON 转换为 POJO 时出错
【发布时间】:2011-09-19 15:02:26
【问题描述】:

我正在这样做:

WebResource resource = client.resource(urlStr); 
resource.accept(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_XML_TYPE);
GenericType<List<EMailInformations>> genericType = new GenericType<List<EMailInformations>>() {};
List<EMailInformations> response = null; 
try{ 
    response = resource.get(genericType); 
} catch (UniformInterfaceException ue) { 
    ClientResponse clientResponse = ue.getResponse(); 
}

类电子邮件信息

@XmlRootElement
public class EMailInformations {
    private long id;

    public EMailInformations(){

    }

    public EMailInformations(long id) {
        super();
        this.id = id;
    }
        //getters & setters ...
}

一些 JSON 响应

{"cn":[{"id":"302","l":"7","d":1308239209000,"rev":14667,"fileAsStr":"TAICHIMARO, Marouane","_attrs":{"lastName":"TAICHIMARO","imAddress1":"other:......

我收到了这个错误:

21 juin 2011 16:56:01 com.sun.jersey.api.client.ClientResponse getEntity
GRAVE: A message body reader for Java class java.util.List, and Java type java.util.List<fr.liberacces.pool.liferay.connecteur.modele.EMailInformations>, and MIME media type text/plain was not found
21 juin 2011 16:56:01 com.sun.jersey.api.client.ClientResponse getEntity
GRAVE: The registered message body readers compatible with the MIME media type are:
text/plain ->
  com.sun.jersey.core.impl.provider.entity.StringProvider
  com.sun.jersey.core.impl.provider.entity.ReaderProvider
*/* ->
  com.sun.jersey.core.impl.provider.entity.FormProvider
  com.sun.jersey.core.impl.provider.entity.StringProvider
  com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
  com.sun.jersey.core.impl.provider.entity.FileProvider
  com.sun.jersey.core.impl.provider.entity.InputStreamProvider
  com.sun.jersey.core.impl.provider.entity.DataSourceProvider
  com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
  com.sun.jersey.core.impl.provider.entity.ReaderProvider
  com.sun.jersey.core.impl.provider.entity.DocumentProvider
  com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader
  com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader
  com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader
  com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$General
  com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
  com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
  com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General
  com.sun.jersey.core.impl.provider.entity.EntityHolderReader
  com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General
  com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy

但是我收到了这个错误:GRAVE: A message body reader for Java class java.util.List, and Java type ... was not found

这是萤火虫的踪迹:

Réponsevoir le code source
Date    Wed, 22 Jun 2011 10:36:19 GMT
Content-Encoding    gzip
Content-Length  634
Via 1.1 zimbra.server.com
Keep-Alive  timeout=15, max=100
Connection  Keep-Alive
Content-Type    text/plain
Requêtevoir le code source
Host    zimbra.server.com
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding gzip, deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive  115
Connection  keep-alive
Cookie  ZM_AUTH_TOKEN=0_01e07d9cb12b86ef4675604362137c08c1d9fd0d_69643d33363a61343831353331382d336436362d343766632d386662393d3133613638633661323165393b6578703d31333a313330383832313935333436393b747970653d363a7a696d6172613b; JSESSIONID=1eb0ksxao39jj

【问题讨论】:

  • 您的代码似乎正确。你能提供整个 HTTP 跟踪吗?内容类型似乎是文本/纯文本(即使它包含有效的 JSON 文本)。小心:resource.accept 并非空穴来风。
  • 我认为这是问题所在,text/plain,Zimbra 的 WS 一点都不好,它们没有提供好的响应……我正在使用 JSON 库解析 json 响应。非常感谢。
  • 这不是解决办法:看我的回答
  • 花费的时间比我想象的要多一点。它就在那里。
  • 这是最好的答案,已经解决了:stackoverflow.com/questions/27341788/…

标签: java json jaxb jersey


【解决方案1】:

我遇到了同样的问题。通过使用“yves amsellem”中的提示,我可以走得更远。 对我来说,我可以使用 POJO 映射器功能解决这个问题。 (需要在服务器端和客户端启用它们。此外还需要库 jersey-json 才能使其正常工作)

ClientConfig config = new DefaultClientConfig();
..
config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
..
Client client = Client.create(config);

我希望这可以帮助您进一步了解问题,即使问题已经过时了。

【讨论】:

  • 在服务器上启用此功能的正确方法是在 Jersey servlet 的包列表中包含org.codehaus.jackson.jaxrs,详情请参阅here
【解决方案2】:

默认情况下,服务器似乎生成了一个内容类型text/plain。小心,您正在协商 JSON 内容类型,但您没有将其传递给调用:

WebResource resource = client.resource(url); 
Builder builder = resource.accept(MediaType.APPLICATION_JSON); 
GenericType<List<EMailInformations>> genericType = 
  new GenericType<List<EMailInformations>>() {};

List<EMailInformations> response = builder.get(genericType); 

首先,您定义路径,然后 Jersey 为您提供了一个构建器来添加内容类型协商、标头、查询参数等。如果您直接调用资源,您将丢失这些参数。

【讨论】:

  • 请给我HTTP跟踪(Web浏览器可以打印那些,如果你不知道怎么做,问)。也许您要求的服务具有特定的内容类型。
  • 我改变了问题,那里有一个 Firebug 跟踪
  • 您的浏览器中显示的响应是什么?如您所见,现代浏览器使用Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8。他们不要求 JSON。
  • 浏览器工作正常,但当我想使用 Jersey 将响应从 json 转换为 pojo 时却不行
  • 在浏览器中获取 JSON 意味着服务没有生成内容类型的 text/html 或 application/xml。该服务默认生成 JSON。也许它没有显示出好的内容类型。看起来很奇怪。
【解决方案3】:

我遇到了类似的错误,结果我的客户端没有到我的服务器的 http 连接。

所以使用 Linux curl 命令或浏览器来读取响应正文,这可能会让您更深入地了解如此一般的错误。

【讨论】:

  • 这不是对问题的回答,而是应作为对问题的评论给出的建议或跟进。
猜你喜欢
  • 1970-01-01
  • 2021-05-03
  • 2016-08-17
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多