【问题标题】:A message body reader for Java class java.util.List,and Java type java.util.List<Em>Java 类 java.util.List 和 Java 类型 java.util.List<Em> 的消息正文阅读器
【发布时间】:2020-12-15 23:15:33
【问题描述】:

找不到 Java 类 java.util.List、Java 类型 java.util.List 和 MIME 媒体类型 application/json 的消息正文阅读器。

我浏览了所有相关的错误链接,但没有任何效果。

Output from client is like this
<employees>
<employee>
<empNo>E02</empNo>
<empName> New Emp1</empName>
<position>Manager</position>
</employee>
<employee>
<empNo>E01</empNo>
<empName>SMITH</empName>
<position>Clerk</position>
</employee>
<employee>
<empNo>E03</empNo>
<empName>SARATH</empName>
<position>AMD</position>
</employee>
</employees>

pom.xml

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-bundle</artifactId>
        <version>1.19.2</version>
    </dependency>
    
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-core</artifactId>
        <version>1.19.2</version>
    </dependency>
    
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.19.2</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.19.2</version>
    </dependency>

这里我有一个从客户端获取 xml 的 java 类。

import java.util.List;

import javax.ws.rs.core.MediaType;

import org.restJersyClint.JersyRestClient.modal.Employee;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.GenericType;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.WebResource.Builder;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;

public class GetJsonAsList 
{
    public static void main(String[] args)
    {
        ClientConfig clientConfig = new DefaultClientConfig();
        
        Client client = Client.create(clientConfig);
        
        WebResource webResourse = client.resource("http://localhost:8080/RestFulCRUD/rest/employee");
        
        Builder builder = webResourse.accept(MediaType.APPLICATION_JSON)//
                    .header("content-type", MediaType.APPLICATION_JSON);
        
        ClientResponse response = builder.get(ClientResponse.class);
        
        //Status 200 is successful
        if(response.getStatus()!=200)
        {
            System.out.println("Failed with HTTP Error Code: " + response.getStatus());
            String error = response.getEntity(String.class);
            System.out.println("Error: " + error);
            return;
        }
        
        GenericType<List<Employee>> generic = new GenericType<List<Employee>>(){};
        
        //from this instance it takes to exception
        List<Employee> list = response.getEntity(generic);
        
        System.out.println("Output from server... \n");
        
        for(Employee emp : list)
        {
            System.out.println("---");
            System.out.println("Emp No..." + emp.getEmpNo());
            System.out.println("Emp Name..." + emp.getEmpName());
            System.out.println("Position..." + emp.getPosition());
        }
    }
}

此时我得到了错误

List<Employee> list = response.getEntity(generic);

Employee.java

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Employee 
{
    private String empNo;
    private String empName;
    private String position;
    
    public Employee()
    {
        
    }
    
    public Employee(String empNo, String empName, String position) 
    {
        super();
        this.empNo = empNo;
        this.empName = empName;
        this.position = position;
    }


    public String getEmpNo() {
        return empNo;
    }
    public void setEmpNo(String empNo) {
        this.empNo = empNo;
    }
    public String getEmpName() {
        return empName;
    }
    public void setEmpName(String empName) {
        this.empName = empName;
    }
    public String getPosition() {
        return position;
    }
    public void setPosition(String position) {
        this.position = position;
    }
}

在控制台中,

Aug 27, 2020 10:03:29 AM com.sun.jersey.api.client.ClientResponse getEntity
SEVERE: A message body reader for Java class java.util.List, and Java type java.util.List<org.restJersyClint.JersyRestClient.modal.Employee>, and MIME media type application/json was not found
Aug 27, 2020 10:03:34 AM com.sun.jersey.api.client.ClientResponse getEntity
SEVERE: The registered message body readers compatible with the MIME media type are:
application/json ->
  com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App
  com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$App
  com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$App
  com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App
  com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App
*/* ->
  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

Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: A message body reader for Java class java.util.List, and Java type java.util.List<org.restJersyClint.JersyRestClient.modal.Employee>, and MIME media type application/json was not found
    at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:630)
    at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:604)
    at org.restJersyClint.JersyRestClient.GetJsonAsList.main(GetJsonAsList.java:46)

我搜索并浏览了所有相关链接,但无法解决。 请帮我解决这个问题。 提前致谢。

【问题讨论】:

  • 您也可以发布您的员工类文件吗?
  • @glegshot 如你所说,我添加了 Employee 类文件。
  • 根据错误,它说无法解析 XML 格式的消息正文,并且可用的解析器是 JSON 变体。你能检查一下吗?
  • @glegshot 我应该怎么做。你能解释一下,我必须做什么?我不明白你的意思。

标签: java arraylist jaxb entity generic-type-argument


【解决方案1】:

这里的问题是响应 pojo 文件需要被解析成 JSON,它需要一个 MessageBodyReader。(默认支持 XML)
您必须为客户端显式设置 POJO 映射配置。

要解决此问题,您应该添加以下代码行(第 2 行)。

    ClientConfig clientConfig = new DefaultClientConfig();
    clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);  // <----- set the json configuration POJO MAPPING for JSON reponse paring
    Client client = Client.create(clientConfig);

同时对 Employee.java 以及以下内容进行更改

    //@XmlRootElement // <-- comment this
    public class Employee

我建议您也阅读 JAX-RS 管道流程,以便更清楚地了解这一点。

还有关于 maven 依赖项。由于您仅使用 json 解析器实现 jersey 客户端(1.x),因此您只需要 pom.xml 中的以下依赖项。

    <dependencies>
    <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-client -->
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
        <version>1.19.1</version>
    </dependency>

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

</dependencies>

【讨论】:

  • stackoverflow.com/a/60631643/11962586 我也经历过这个。我试过这个。但是问题没有得到解决。您的代码与此相同。
  • @Sarath69Kumar ,您能告诉我在您的代码中添加这行代码时遇到的错误是什么吗?上面的解决方案是针对您发布的错误。您可能还有其他依赖项也不见了。
  • Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@43c1b556; line: 1, column: 1] 这是我添加该行后得到的。
  • @Sarath69Kumar 这是与前面提到的完全不同的错误。请告诉我这是一直以来的错误,还是您进行了上面建议的更改然后出现此错误。跨度>
  • 我只是在我的代码中添加了一行,即clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
猜你喜欢
  • 2015-11-14
  • 2014-03-20
  • 1970-01-01
  • 2014-06-05
  • 2013-12-15
  • 2016-06-14
  • 2010-12-28
相关资源
最近更新 更多