A message body reader for Java class java.util.List,and Java type java.util.List<Em>

Viewed 846

A message body reader for Java class java.util.List,and Java type java.util.List<org.Employee>,and MIME media type application/json was not found.

I went through all the related error links, but nothing worked.

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>

Here I have a java class which gets the xml from client.

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());
        }
    }
}

At this point im getting the error

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;
    }
}

In console,

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)

I searched and went through all the related links, but couldn't solve. Please help me to solve this. Thanks in advance.

1 Answers

The issue here is the response pojo file needs to be parsed into JSON and it requires a MessageBodyReader.( XML is supported by default)
You have to explicity set the POJO Mapping Configuration for the client.

To fix the issue you should add the below line of code(Line 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);

Also make the change for Employee.java as well as below

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

I would recommend you to read the JAX-RS pipeline flow as well to get a more clear understanding on the same.

Also regarding the maven dependencies.Since you are implementing a jersey client(1.x) only with json parser ,you would need only the below dependencies in your 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>
Related