[英]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 库:
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.List
或java.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.