严重:未找到 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
SEVERE: A message body writer for Java class java.util.ArrayList and MIME media type application/json was not found
提问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 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
无法识别@XmlRootElement
超过java.util.List
或java.util.ArrayList
类定义。
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.
请尝试这种方法,它会起作用。
回答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 @XmlRootElement
but 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 container
of 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
}