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

时间:2011-12-21 18:40:32

标签: java json rest jersey

我有一个基于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字符串响应,但是没有发生第三行将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注释。我错过了什么

谢谢

15 个答案:

答案 0 :(得分:29)

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

答案 1 :(得分:25)

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

  1. 首先,您需要为对象类/实体提供 @XmlRootElement 注释。
  2. 如果您缺少,则需要为 jersey-json 添加依赖项。作为参考,我将此依赖项添加到我的pom.xml中。

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.17.1</version>
    </dependency>
    

答案 2 :(得分:10)

刚刚把这个

    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>

答案 3 :(得分:10)

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

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

@XmlRootElement(name = "someName")

答案 4 :(得分:8)

如果您正在构建一个uberjar或&#34;阴影jar&#34;,请确保合并了meta inf服务文件。 (这在dropwizard项目中多次出现。)

如果您使用的是gradle shadowJar插件,则需要在mergeServiceFiles()目标中调用shadowJarhttps://github.com/johnrengelman/shadow#merging-service-files

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

答案 5 :(得分:4)

我们还决定使用运动衫作为解决方案。但是,由于我们在大多数情况下使用org.JSON,这种依赖是不必要的,我们觉得不好。

因此我们使用String表示来获取org.JSON对象,而不是

JSONObject output = response.getEntity(JSONObject.class); 

我们现在就这样使用它:

JSONObject output = new JSONObject(response.getEntity(String.class)); 

其中JSONObject来自org.JSON,导入可以从:

更改
-import org.codehaus.jettison.json.JSONArray;
-import org.codehaus.jettison.json.JSONException;
-import org.codehaus.jettison.json.JSONObject;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;

答案 6 :(得分:3)

就我而言,我正在使用POJO。我忘了将POJOMappingFeature配置为true。 梅康在早期的回答中指出了这一点。但是有些人可能无法在web.xml中正确配置它,这是我的例子。

<servlet>
    <servlet-name>Jersey Servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

答案 7 :(得分:3)

在课程开始之前,只需在POJO中添加以下行,您的问题就会得到解决。      @Produces(&#34;应用/ JSON&#34)      @XmlRootElement      见例子      import javax.ws.rs.Produces;      import javax.xml.bind.annotation.XmlRootElement;

 /**
 * @author manoj.kumar
 * @email kumarmanoj.mtech@gmail.com
 */
 @Produces("application/json")
 @XmlRootElement  
 public class User {

 private String username;
 private String password;
 private String email;
 public String getUsername() {
 return username;
 }
 public void setUsername(String username) {
     this.username = username;
 }
 public String getPassword() {
     return password;
 }
 public void setPassword(String password) {
     this.password = password;
 }
 public String getEmail() {
    return email;
 }
 public void setEmail(String email) {
    this.email = email;
 }

}
add below lines inside of your web.xml
<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>  
Now recompile your webservice everything would work!!!

答案 8 :(得分:2)

尝试添加:

self.navigationController.navigationBar.isTranslucent = false

如果您将<dependency> <groupId>com.owlike</groupId> <artifactId>genson</artifactId> <version>1.4</version> </dependency> 与邮件正文一起使用,也可能会出现此问题,因此在这种情况下添加jersey-json lib,HTTP GET或修改web.xml将无济于事。您应该使用网址@XmlRootElementQueryParam

答案 9 :(得分:0)

您需要为自己的班级MessageBodyReader实施自己的MessageBodyWriterLorg.shoppingsite.model.entity.jpa.User

package javax.ws.rs.ext;

import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;

public interface MessageBodyReader<T extends Object> {

    public boolean isReadable(Class<?> type, 
        Type genericType, 
        Annotation[] annotations, 
        MediaType mediaType);

    public T readFrom(Class<T> type, 
        Type genericType, 
        Annotation[] annotations, 
        MediaType mediaType, 
        MultivaluedMap<String, String> httpHeaders, 
        InputStream entityStream) throws IOException, WebApplicationException;
}

package javax.ws.rs.ext;

import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;

public interface MessageBodyWriter<T extends Object> {

    public boolean isWriteable(Class<?> type, 
        Type genericType, 
        Annotation[] annotations, 
        MediaType mediaType);

    public long getSize(T t, 
        Class<?> type, 
        Type genericType, 
        Annotation[] annotations, 
        MediaType mediaType);

    public void writeTo(T t, 
        Class<?> type, 
        Type genericType, 
        Annotation[] annotations, 
        MediaType mediaType, 
        MultivaluedMap<String, Object> httpHeaders, 
        OutputStream entityStream) throws IOException, WebApplicationException;
}

答案 10 :(得分:0)

检查你是否在eclipse中运行不同的实例。我退出了所有其他会话,清理构建修复了问题

答案 11 :(得分:0)

有些人可能会感到困惑,为什么添加jersey-json jar无法解决这个问题。我发现这个罐子比jersey-json-1.7.jar更新(1.7.0不起作用,但1.7.1工作正常。)。希望这可以帮助

答案 12 :(得分:0)

对于Python和Swagger示例:

import requests
base_url = 'https://petstore.swagger.io/v2'
def store_order(uid):
    api_url = f"{base_url}/store/order"
    api_data = {
        'id':uid,
        "petId": 0,
        "quantity": 0,
        "shipDate": "2020-04-08T07:56:05.832Z",
        "status": "placed",
        "complete": "true"
        }
    # is a kind of magic..
    r = requests.post(api_url, json=api_data)
    return r
print(store_order(0).content)    

MIME类型最重要的字符串: r = request.post(api_url,json = api_data)

答案 13 :(得分:0)

Q)代码在Intellj中工作正常,但在命令行中失败。

Sol)将球衣的依赖项添加为直接依赖项,而不是暂时性依赖项。

原因:由于与IntelliJ配合正常,因此正确配置了依赖项。

  1. 通过以下任一方式获取所需的依赖项:

    1. 检查IntelliJ运行命令。 Stackoverflow-link
    2. 列出来自maven mvn dependency:tree的依赖项
  2. 现在,显式添加那些有问题的球衣依赖项。

答案 14 :(得分:-3)

我的情况类似。我在关键时刻得到这个错误,我不记得以前我是如何解决它的,我做了很多次。经过长时间的检查,我已经解决并重现了错误,并确定了解决这种情况的简单方法。

好的 - 解决方案:删除(或更正)对主项目属性文件的任何新更改。

是的,就是这样。事实上,我的项目是一个多模块的巨大的项目,你知道没有正确的依赖是一个罕见的情况,因为经常从git(RAC)获取。我的项目几乎所有可配置的东西都来自一个属性文件,这个文件大约有15个左右的模块(子项目),它们之间具有大量的内部依赖性。 jersey-json的依赖总是存在于我合并的父pom中。 XML注释不是问题,因为项目在修改后运行了大约100次。这里的一些解决方案指向web.xml和POJOMappingFeature之类的东西。在我的情况下,我甚至没有触及此版本中的webapp模块。所以无论如何,这个解决方案对我有用,我花时间在SO中记录这个以防万一我碰巧遇到这个错误,我不必浪费我昏昏欲睡的夜晚。 (当然,也适合你)