简体   繁体   English

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

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

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.我正在测试 RESTful 服务,当我执行时,虽然我的类路径(WEB-INF/lib)中有以下 jar,但我没有使用 Maven,我的 JDK 版本是 1.5,但我得到了异常。 Other questions regarding this issue didn't help to resolve the problem.有关此问题的其他问题无助于解决问题。

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
jackson-xc-1.2.0.jar
jackson-jaxrs-1.2.0.jar
jackson-mapper-asl-1.2.0.jar
jackson-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.access$800(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?我该如何解决这个问题?

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 @Produces annotation.我见过其他人也用这种方式编写他们的服务层代码,但 Jersey 提供了一种干净利落的方法,它将支持 JSON、XML 和 HTML 输出,您只需要使用@Produces批注指定这些输出。 This is what I do:这就是我所做的:

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球衣核心1.8.jar
  • jersey-json-1.8.jar球衣-json-1.8.jar
  • jersey-server-1.8.jar jersey-server-1.8.jar

You cannot define the response Xml as List<Emp> , as the JAXB is unable to identify the @XmlRootElement over the java.util.List or java.util.ArrayList class definition.您不能将响应Xml定义为List<Emp> ,因为JAXB无法通过java.util.Listjava.util.ArrayList类定义识别@XmlRootElement

Ideally, you should have one parent/root element for your collection of Child Elements.理想情况下,您的子元素集合应该有一个父/根元素。

Create one more Class as Employees to contains the Collection of Emp objects 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.请尝试这种方法,它会起作用。

Make sure you don't have multiple Jersey versions in your project.确保您的项目中没有多个 Jersey 版本。 From the list you provided there are modules from 3 different versions (1.2, 1.10, 1.8).在您提供的列表中,有来自 3 个不同版本(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.对于某些模块,Jersey 会检查模块的版本是否与核心的版本相同。 If it's not then providers of the module (such as MessageBodyReaders, MessageBodyWriters) are not registered in the runtime.如果不是,则模块的提供者(例如 MessageBodyReaders、MessageBodyWriters)不会在运行时中注册。 This can be problem in your setup - json vs core (1.8 vs 1.2).这可能是您设置中的问题 - json 与核心(1.8 与 1.2)。

Add this to your pom.xml.将此添加到您的 pom.xml。 Solved my problem.解决了我的问题。

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

Specifying @XmlRootElement(name = "yourclass") on the class you want to pass as output.在要作为输出传递的类上指定@XmlRootElement(name = "yourclass") This has solved the problem for me when I get this exception.当我收到此异常时,这为我解决了问题。

I had the same problem.我有同样的问题。

The thing is it knows how to convert it to xml with the annotation @XmlRootElement but it doesn't know how to convert it to JSON.问题是它知道如何使用注释@XmlRootElement将其转换为 xml,但它不知道如何将其转换为 JSON。

So for making it convert everything to JSON with the same annotation of xml(ie @XmlRootElement ) we can add因此,为了使其使用相同的 xml 注释(即@XmlRootElement )将所有内容转换为 JSON,我们可以添加

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它也应该有一个无参数构造函数

You have to declare in the servlet container of jersey the param as the following:您必须在 jersey 的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>

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

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("celal.aygar@gmail.com");    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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 找不到Java类java.util.ArrayList和MIME媒体类型application / json的消息正文编写器 - A message body writer for Java class java.util.ArrayList and MIME media type application/json was not found 找不到Java类型类java.util.ArrayList和MIME媒体类型application / xml的消息正文编写器 - A message body writer for Java type, class java.util.ArrayList, and MIME media type, application/xml, was not found 找不到Java类java.util.ArrayList和Java类型类java.util.ArrayList和MIME媒体类型application / json的消息正文编写器 - A message body writer for Java class java.util.ArrayList, and Java type class java.util.ArrayList, and MIME media type application/json was not found 未找到Java类java.util.ArrayList ...和MIME媒体类型text / xml的消息正文编写器 - A message body writer for Java class java.util.ArrayList…and MIME media type text/xml was not found 找不到用于Java类型org.json.JSONObject和MIME媒体类型application / json的消息正文编写器 - A message body writer for Java type, class org.json.JSONObject, and MIME media type, application/json, was not found Java类java.util.ArrayList的消息体编写器 - A message body writer for Java class java.util.ArrayList 找不到媒体类型=应用程序/json,类型=类 java.util.ArrayList 的 MessageBodyWriter - MessageBodyWriter not found for media type=application/json, type=class java.util.ArrayList Weblogic配置错误-找不到Java类和Java类型类以及MIME媒体类型application / json的消息正文编写器 - Weblogic config error - Message body writer for Java class, and Java type class, and MIME media type application/json was not found 找不到用于Java类型myPackage.Sample和MIME媒体类型application / xml的消息正文编写器 - A message body writer for Java type, class myPackage.Sample, and MIME media type, application/xml, was not found 找不到用于Java类型,类bookInfoListType和MIME媒体类型application / xml的消息正文编写器 - A message body writer for Java type, class bookInfoListType, and MIME media type application/xml was not found
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM