严重:未找到 Java 类 java.util.ArrayList 和 MIME 媒体类型 application/json 的消息正文编写器

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20116444/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 23:14:22  来源:igfitidea点击:

SEVERE: A message body writer for Java class java.util.ArrayList and MIME media type application/json was not found

javarestjerseyoc4jjdk1.5

提问by J?cob

I am testing RESTful services and when I execute I am getting exceptions although I have the following jars in my class path(WEB-INF/lib), I am not using Maven and my JDK version is 1.5. Other questions regarding this issue didn't help to resolve the problem.

我正在测试 RESTful 服务,当我执行时,虽然我的类路径(WEB-INF/lib)中有以下 jar,但我没有使用 Maven,我的 JDK 版本是 1.5,但我得到了异常。有关此问题的其他问题无助于解决问题。

Code snippet

代码片段

@GET
@Produces("application/json")    
//@Produces({MediaType.APPLICATION_JSON}) tried this, didn't work either
public List<Emp> getEmployees() {        
    List<Emp> empList = myDAO.getAllEmployees();
    log.info("size   " + empList.size());
    return empList;
}

@XmlRootElement
public class Emp {
......

web.xml

网页.xml

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>test.employees</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>

 <servlet-mapping>
    <servlet-name>Jersey Web Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

List of jars

罐子清单

jersey-server-1.2.jar
jersey-core-1.2.jar
jsr311-api-1.1.jar
asm-3.1.jar
jaxb-api-2.0.jar
jaxb-impl-2.0.jar
Hymanson-xc-1.2.0.jar
Hymanson-jaxrs-1.2.0.jar
Hymanson-mapper-asl-1.2.0.jar
Hymanson-core-asl-1.2.0.jar
jettison-1.2.jar
jersey-client-1.2.jar
jersey-servlet-1.10.jar
jersey-json-1.8.jar

Exception stack

异常堆栈

 SEVERE: A message body writer for Java class java.util.ArrayList,
 and Java type java.util.List<test.Emp>, 
 and MIME media type application/json was not found
Nov 21, 2013 11:47:26 AM com.sun.jersey.spi.container.ContainerResponse traceException
SEVERE: Mapped exception to response: 500 (Internal Server Error)

javax.ws.rs.WebApplicationException
    at javax.ws.rs.WebApplicationException.<init>(WebApplicationException.java:97)
    at javax.ws.rs.WebApplicationException.<init>(WebApplicationException.java:55)
    at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:267)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1035)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:947)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:939)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:399)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:478)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:663)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:719)
    at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:376)
    at com.evermind.server.http.HttpRequestHandler.doProcessRequest(HttpRequestHandler.java:870)
    at com.evermind.server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:451)
    at com.evermind.server.http.HttpRequestHandler.serveOneRequest(HttpRequestHandler.java:218)
    at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.java:119)
    at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.java:112)
    at oracle.oc4j.network.ServerSocketReadHandler$SafeRunnable.run(ServerSocketReadHandler.java:260)
    at oracle.oc4j.network.ServerSocketAcceptHandler.procClientSocket(ServerSocketAcceptHandler.java:230)
    at oracle.oc4j.network.ServerSocketAcceptHandler.access0(ServerSocketAcceptHandler.java:33)
    at oracle.oc4j.network.ServerSocketAcceptHandler$AcceptHandlerHorse.run(ServerSocketAcceptHandler.java:831)
    at com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:303)
    at java.lang.Thread.run(Thread.java:595)

How can I resolve this issue?

我该如何解决这个问题?

采纳答案by Michal Gajdos

Make sure you don't have multiple Jersey versions in your project. From the list you provided there are modules from 3 different versions (1.2, 1.10, 1.8). For some modules Jersey does a check that the version of a module is the same as the version of the core. If it's not then providers of the module (such as MessageBodyReaders, MessageBodyWriters) are not registered in the runtime. This can be problem in your setup - json vs core (1.8 vs 1.2).

确保您的项目中没有多个 Jersey 版本。在您提供的列表中,有来自 3 个不同版本(1.2、1.10、1.8)的模块。对于某些模块,Jersey 会检查模块的版本是否与核心的版本相同。如果不是,则模块的提供者(例如 MessageBodyReaders、MessageBodyWriters)不会在运行时中注册。这可能是您设置中的问题 - json 与核心(1.8 与 1.2)。

回答by omega

You cannot define the response Xmlas List<Emp>, as the JAXBis unable to identify the @XmlRootElementover the java.util.Listor java.util.ArrayListclass definition.

你不能定义响应XmlList<Emp>,因为JAXB无法识别@XmlRootElement超过java.util.Listjava.util.ArrayList类定义。

Ideally, you should have one parent/root element for your collection of Child Elements.

理想情况下,您的子元素集合应该有一个父/根元素。

Create one more Class as Employeesto contains the Collection of Empobjects as like below and try it.

再创建一个类Employees以包含Emp如下所示的对象集合并尝试它。

@GET
@Produces("application/json")    
public Employees getEmployees() {        
    List<Emp> empList = myDAO.getAllEmployees();
    log.info("size   " + empList.size());
    Employees employees = new Employees();
    employees.setEmployeeList(empList);

    return employees;
}

@XmlRootElement(name = "Employees")
public class Employees {

    List<Emp> employeeList;

    //setters and getters goes here
}

@XmlRootElement()
class Emp {
   //fields here
}

Please try this approach, it will work.

请尝试这种方法,它会起作用。

回答by Russ Bateman

The problem may be how you're trying to return your result. I have seen others write their service-layer code this way too, but Jersey provides a way to do it cleanly and it will support JSON, XML and HTML output which you only need to specify using your @Producesannotation. This is what I do:

问题可能在于您尝试返回结果的方式。我见过其他人也用这种方式编写他们的服务层代码,但 Jersey 提供了一种干净利落的方法,它将支持 JSON、XML 和 HTML 输出,您只需要使用@Produces批注指定这些输出。这就是我所做的:

import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.GenericEntity;
import javax.ws.rs.core.Response;

@GET
@Produces( MediaType.APPLICATION_JSON )
public Response getEmployees()
{        
    List< Emp >                  matched;
    GenericEntity< List< Emp > > entity;

    matched = myDAO.getAllEmployees();
    entity  = new GenericEntity< List< Emp > >( matched ) { };

    return Response.ok( entity ).build();
}

I'm using the following Jersey libraries:

我正在使用以下 Jersey 库:

  • jersey-core-1.8.jar
  • jersey-json-1.8.jar
  • jersey-server-1.8.jar
  • 球衣核心1.8.jar
  • 球衣-json-1.8.jar
  • jersey-server-1.8.jar

回答by Michiel

Add this to your pom.xml. Solved my problem.

将此添加到您的 pom.xml。解决了我的问题。

        <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.18.1</version>
    </dependency>
    <dependency>
        <groupId>com.owlike</groupId>
        <artifactId>genson</artifactId>
        <version>0.99</version>
    </dependency>

回答by Ramjiraju Kammila

Specifying @XmlRootElement(name = "yourclass")on the class you want to pass as output. This has solved the problem for me when I get this exception.

指定@XmlRootElement(name = "yourclass")要作为输出传递的类。当我收到此异常时,这为我解决了问题。

回答by padippist

I had the same problem.

我有同样的问题。

The thing is it knows how to convert it to xml with the annotation @XmlRootElementbut it doesn't know how to convert it to JSON.

问题是它知道如何使用注释将其转换为 xml,@XmlRootElement但它不知道如何将其转换为 JSON。

So for making it convert everything to JSON with the same annotation of xml(ie @XmlRootElement) we can add

因此,为了使用相同的 xml(ie @XmlRootElement)注释将所有内容转换为 JSON,我们可以添加

jersey-media-moxy-<whatever version>.jar

jersey-media-moxy-<whatever version>.jar

or for maven users

或者对于 maven 用户

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
</dependency>

Also it should have a no argument constructor

它也应该有一个无参数构造函数

回答by Maiga

You have to declare in the servlet containerof jersey the param as the following:

您必须在servlet container球衣的参数中声明如下:

'com.sun.jersey.api.json.POJOMappingFeature' like this: 
 <servlet>
    <servlet-name>myServices</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>services</param-value>
    </init-param>
    <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>

回答by Niraj singh

cross check your pojo class may be not done the JAXBinding if not done mark your pojo with @XmlRootElement

交叉检查你的 pojo 类可能没有完成 JAXBinding 如果没有完成用 @XmlRootElement 标记你的 pojo

回答by Hac? Celal Aygar

I had same problem. Then I solved it.

我有同样的问题。然后我解决了它。

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>aaa</groupId>
    <artifactId>aaa</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <build>
        <sourceDirectory>src</sourceDirectory>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>

    </build>
    <dependencies>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-json</artifactId>
            <version>1.18.1</version>
        </dependency>
        <dependency>
            <groupId>com.owlike</groupId>
            <artifactId>genson</artifactId>
            <version>0.99</version>
        </dependency>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.7.3</version>
        </dependency>
        <dependency>
            <groupId>jakarta.ws.rs</groupId>
            <artifactId>jakarta.ws.rs-api</artifactId>
            <version>2.1.6</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-bundle</artifactId>
            <version>1.19.4</version>
        </dependency>
    </dependencies>
</project>

My method is here.

我的方法在这里。

public static void postData() {
    Staff staff = new Staff();
    staff.setStaffname("Celal");                staff.setStafflastname("Aygar");
    staff.setEmail("[email protected]");    staff.setGender("Male");
    staff.setCity("DENIZLI");
    String uri = "http://localhost:8185/staff";
    ClientConfig clientConfig = new DefaultClientConfig();
    clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, true);
    Client client = Client.create(clientConfig);
    WebResource resource = client.resource(uri);
    try {
        ClientResponse response = resource.type(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON)
                .post(ClientResponse.class, staff);
        if (response.getStatus() == 200) System.out.println("Staff detail : " + response.getEntity(Staff.class));
    } catch (Exception e) { System.out.println("Exception is:" + e.getMessage()); }
}

My entity is here.

我的实体在这里。

@XmlRootElement()
public class Staff {
    private Long staffid;

    private String staffname;
    private String stafflastname;
    private String gender;
    private String email;
    private String city;

    //getter setter toString

}