Jersey异常:SEVERE:Java类的消息体阅读器

VDe*_*Dev 35 java rest json jersey

我有一个基于泽西岛的Rest WS输出JSON.我正在实现一个Jersey客户端来调用WS并使用JSON响应.我的客户端代码如下

WebResource r = restClient.resource(UriBuilder.fromUri("http://localhost/").port(8080).build());
String resp = r.path("/user").accept(MediaType.APPLICATION_JSON).get(String.class);
User[] users = r.path("/user").accept(MediaType.APPLICATION_JSON).get(User[].class);

第二行正确输出JSON字符串响应,但第3行将JSON编组到POJO没有发生,我得到以下异常堆栈跟踪

SEVERE: A message body reader for Java class [Lorg.shoppingsite.model.entity.jpa.User;, and Java type class [Lorg.shoppingsite.model.entity.jpa.User;, and MIME media type application/json was not found
Dec 21, 2011 11:32:01 AM com.sun.jersey.api.client.ClientResponse getEntity
SEVERE: The registered message body readers compatible with the MIME media type are:
*/* ->
  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.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

我的请求中有正确​​的MIME类型.我的POJO已使用XMLRootElement注释.我错过了什么

谢谢

VDe*_*Dev 29

我能够通过为jersey-json添加maven依赖来解决这个问题.

  • 我面临同样的问题,我也对jersey-json进行了测试.但它解决了这个问题. (4认同)

小智 27

为了使它工作,你只需要两件事.检查您是否遗失:

  1. 首先,您需要为对象类/实体提供@XmlRootElement注释.
  2. 如果你缺少,你需要为jersey-json添加依赖.为了你的参考,我把这个依赖添加到我的pom.xml中.

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.17.1</version>
    </dependency>
    
    Run Code Online (Sandbox Code Playgroud)


小智 10

就这么说吧

    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用,搞砸了我的设置. (3认同)

小智 10

我知道这篇文章已经很久了,你很久以前就已经知道了这个帖子,但只是为了挽救那些读过这篇文章的人.

您可能忘记将注释添加到要传递给端点的实体,因此Jersey不知道如何处理它收到的POJO.用这样的东西注释pojo:

@XmlRootElement(name = "someName")
Run Code Online (Sandbox Code Playgroud)


moo*_*eds 8

如果要构建uberjar或"阴影jar",请确保合并了meta inf服务文件.(这在一个dropwizard项目中多次出现.)

如果您使用的是gradle这个shadowJar插件,你想打电话给mergeServiceFiles()你的shadowJar目标:https://github.com/johnrengelman/shadow#merging-service-files

不确定maven或其他构建系统的类似命令是什么.

  • https://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#ServicesResourceTransformer &lt;-有关maven方式的文档。 (2认同)