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

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

代码段

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

web.xml中

  Jersey Web Application com.sun.jersey.spi.container.servlet.ServletContainer  com.sun.jersey.config.property.packages test.employees   com.sun.jersey.api.json.POJOMappingFeature true    Jersey Web Application /rest/*  

jar子列表

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

  SEVERE: A message body writer for Java class java.util.ArrayList, and Java type java.util.List, 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.(WebApplicationException.java:97) at javax.ws.rs.WebApplicationException.(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) 

我该如何解决这个问题?

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

问题可能在于您是如何尝试返回结果的。 我已经看到其他人也以这种方式编写服务层代码,但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(); } 

我正在使用以下Jersey库:

  • jersey核心 – 1.8.jar
  • 新泽西州JSON-1.8.jar
  • 新泽西服务器1.8.jar

您无法将响应Xml定义为List ,因为JAXB无法通过java.util.Listjava.util.ArrayList类定义标识@XmlRootElement

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

再创建一个Class作为Employees以包含Emp对象的Collection,如下所示并尝试它。

 @GET @Produces("application/json") public Employees getEmployees() { List empList = myDAO.getAllEmployees(); log.info("size " + empList.size()); Employees employees = new Employees(); employees.setEmployeeList(empList); return employees; } @XmlRootElement(name = "Employees") public class Employees { List employeeList; //setters and getters goes here } @XmlRootElement() class Emp { //fields here } 

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

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

   com.sun.jersey jersey-json 1.18.1   com.owlike genson 0.99  

在要作为输出传递的类上指定@XmlRootElement(name = "yourclass") 。 当我得到这个例外时,这解决了我的问题。

我有同样的问题。

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

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

jersey-media-moxy-.jar

或者对于maven用户

  org.glassfish.jersey.media jersey-media-moxy  

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

你必须在jersey的servlet container中声明param如下:

 'com.sun.jersey.api.json.POJOMappingFeature' like this:  myServices com.sun.jersey.spi.container.servlet.ServletContainer  com.sun.jersey.config.property.packages services   com.sun.jersey.api.json.POJOMappingFeature true  1  

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