我正在尝试使用简单的Jersey + JSON示例但我收到以下错误
message body writer for Java class com.test.jsonexample and MIME media type application/json was not found
我将以下jar文件用于获取适当的结果
asm-3.1.jar
jackson-core-asl-1.9.9.jar
jackson-jaxrs-1.9.9.jar
jackson-mapper-asl-1.9.9.jar
jackson-xc-1.9.9.jar
jersey-client-1.9.jar
jersey-core-1.9.1.jar
jersey-json-1.9.jar
jersey-server-1.9.1.jar
jettison-1.3.2.jar
jsr311-api-1.1.1.jar
为什么我会收到此类错误?错误日志在这里:
SEVERE: Mapped exception to response: 500 (Internal Server Error)
javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class com.test.Jsonexample, and Java type class com.test.Jsonexample, and MIME media type application/json was not found
at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:285)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1437)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
的web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>TestJaxRs</display-name>
<servlet>
<servlet-name>jersey-serlvet</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>com.test.rest</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>
<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
JsonExample.java
@XmlRootElement
public class JsonExample {
String title;
String singer;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSinger() {
return singer;
}
public void setSinger(String singer) {
this.singer = singer;
}
@Override
public String toString() {
return "JsonExample [title=" + title + ", singer=" + singer + "]";
}
}
和Json服务
@Path("/json/metallica")
public class JSONService {
@GET
@Path("/get")
@Produces(MediaType.APPLICATION_JSON)
public JsonExample getTrackInJSON() {
JsonExample json = new JsonExample();
json.setTitle("Enter Sandman");
json.setSinger("Metallica");
return json;
}
@POST
@Path("/post")
@Consumes(MediaType.APPLICATION_JSON)
public Response createTrackInJSON(JsonExample track) {
String result = "Track saved : " + track;
return Response.status(201).entity(result).build();
}
如果我做错了,请建议我。
答案 0 :(得分:13)
使用jersey-bundle-1.8.jar修复此问题
答案 1 :(得分:7)
通过将以下内容添加到我的pom.xml中来解决问题:
<dependency>
<groupId>com.owlike</groupId>
<artifactId>genson</artifactId>
<version>0.99</version>
</dependency>
可在以下网址找到文档:https://code.google.com/p/genson/
答案 2 :(得分:4)
首先,如果您的@POST
网络服务返回响应,则必须添加@Produces
注释。
确保jersey-json
lib位于类路径中。
尝试删除toString()
方法,因为它可能会破坏bean结构格式。
答案 3 :(得分:3)
如果你没有与杰克森联系,你可以试试Genson图书馆http://owlike.github.io/genson/。 您只需要类路径中的lib,并且每个东西都可以在没有任何其他代码的情况下工作。您甚至不必在web.xml中使用POJOMappingFeature,也不必在pojo上添加@XMLRootElement!
您还可以使用泽西机制(ContextResolver)注入具有特定配置的Genson实例。
答案 4 :(得分:3)
添加以下依赖项以解决问题
"javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class com.test.Jsonexample, and Java type class com.test.Jsonexample, and MIME media type application/json was not found
at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:285)"
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-bundle</artifactId>
<version>1.18</version>
</dependency>
答案 5 :(得分:3)
尝试使用'com.sun.jersey:jersey-bundle:1.19'
并且没有解决。
为我设置了genson
的依赖关系。
runtime(
'com.owlike:genson:0.99'
)
答案 6 :(得分:2)
我花了4天的时间在这上面,经过谷歌搜索几个小时后,为什么我的POST根本没有工作。我得到了这个错误以及与MOXY有关的其他错误,例如classdefnotfound错误,因为stackoverflow上的人建议使用MOXY而不是Jackson。我也尝试过genson库,它也没有任何区别。
我最终完全删除了MOXY并且只保留了杰克逊。几个小时后我终于找到了解决方案,这让我生气了一点,因为它有多么简单。我的工作区分为多个不同的项目,一个用于Web应用程序,其中包含web.xml,另一个用于RESTful API。
我也在运行Jersey 2,这是另一个问题,因为这个问题的许多已接受的答案只谈到了Jersey 1,当我第一次尝试解决这个问题时,这是非常令人困惑的。
经过数小时和数小时的尝试后,最终归结为此(使用OP中发布的代码结构):
您必须在POJO类的顶部包含@XmlRootElement,这与stackoverflow上似乎省略它的许多示例相反。
您必须在包含web.xml的项目以及包含REST服务和关联类的项目中包含以下内容。更改与您正在使用的Jersey版本相关的版本。
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.5.1</version>
</dependency>
就是这样。除此之外,您不需要包含任何其他内容以及您正在使用的相关Jersey文库。
我真的希望这有助于其他人节省数小时的时间来解决这个问题。
答案 7 :(得分:1)
我有同样的问题,我修复了删除所有json依赖项并添加 com.owlike genson 0.99
答案 8 :(得分:1)
我知道这是一个老问题,但我遇到了这些问题并尝试了上述所有解决方案,但不幸的是,他们都没有帮助我。 我发现,类MediaType是在两个不同的jar中定义的,并且在构建jar时,它采用了在另一个类中定义的类(在我的例子中,是glassfish jar)。 删除另一个jar后(也可以排除特定部分),问题解决了
答案 9 :(得分:1)
当使用jersey-bundle-1.19.1.jar(非maven)时,我不得不删除它:
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
来自web.xml文件。
我知道文档表明这一部分是必要的,但令人惊讶的是这是问题的原因。
答案 10 :(得分:0)
对于Maven的新版本,如果您有依赖性问题,这里有一个很好的官方参考: https://jersey.java.net/documentation/latest/modules-and-dependencies.html#d0e383(第2.3.1节,第2.3.2节)
这里也是一个很好的教程,用于在eclipse中安装Jersey的maven和tuto: http://javaposts.wordpress.com/2012/01/14/maven-rest-jersey-eclipse-tutorial/
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- if you are using Jersey client specific features -->
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
答案 11 :(得分:0)
同时检查post方法的实际类型参数。
还有gson作为依赖项,我应该使用JSONObject(来自Jersey-Json的Jettison)而不是JsonObject(gson),这导致了相同的异常。
答案 12 :(得分:0)
在POM.xml中包含此依赖项并运行Maven - &gt;更新
<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>
答案 13 :(得分:0)
我尝试下载以下jar库:
当我下载 gson 0.99 时,我的休息服务工作正常。
答案 14 :(得分:0)
我对1.19.4球衣也有同样的问题。通过添加
进行了修复compile group: 'com.fasterxml.jackson.jaxrs', name: 'jackson-jaxrs-json-provider', version: '2.10.0.pr1'
获取依赖。
谢谢, Praveen R。