找不到Jersey + Json媒体类型应用程序/ json

我正在尝试简单的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中

   TestJaxRs  jersey-serlvet com.sun.jersey.spi.container.servlet.ServletContainer  com.sun.jersey.config.property.packages com.test.rest   com.sun.jersey.api.json.POJOMappingFeature true  1   jersey-serlvet /rest/*   

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(); } 

如果我做错了,请建议我。

使用jersey-bundle-1.8.jar修复此问题

修复了我的pom.xml中添加以下内容的问题:

   com.owlike genson 0.99  

可在以下url找到文档: https : //code.google.com/p/genson/

首先,如果您的@POST Web服务返回响应,则必须添加@Produces注释。

确保jersey-json lib在您的类路径中。 尝试删除toString()方法,因为它可能会破坏bean结构格式。

如果你没有与杰克森联系,你可以试试Genson图书馆http://owlike.github.io/genson/ 。 您只需要类路径中的lib,并且每个东西都可以在没有任何其他代码的情况下工作。 你甚至不必在web.xml中使用POJOMappingFeature,也不必在你的pojo上添加@XMLRootElement!

您还可以使用泽西机制(ContextResolver)注入具有特定配置的Genson实例。

尝试'com.sun.jersey:jersey-bundle:1.19'但它没有解决。

设置对genson的依赖为我解决了。

 runtime( 'com.owlike:genson:0.99' ) 

添加以下依赖项以解决问题

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

方案:

  com.sun.jersey jersey-bundle 1.18  

我花了4天时间在这上面,谷歌搜索了几个小时后,为什么我的POST根本不工作。 我得到了这个错误以及与MOXY有关的其他错误,例如classdefnotfound错误,因为stackoverflow上的人建议使用MOXY而不是Jackson。 我也尝试过genson库,它也没有任何区别。

我最终完全删除了MOXY并且只保留了Jackson。 几个小时后,我终于找到了解决方案,这让我生气了一点,因为它有多么简单。 我的工作区分为多个不同的项目,一个用于Web应用程序,用于保存web.xml,另一个用于RESTful API。

我也在运行泽西2,这是另一个问题,因为这个问题的很多可接受的答案只谈到了泽西1号,当我第一次尝试解决这个问题时,它非常令人困惑。

经过数小时和数小时的尝试后,最终归结为此(使用OP中发布的代码结构):

  1. 您必须在POJO类的顶部包含@XmlRootElement,这与stackoverflow上的许多似乎省略它的示例相反。

  2. 您必须在包含web.xml的项目以及包含REST服务和关联类的项目中包含以下内容。 更改与您正在使用的Jersey版本相关的版本。

      org.glassfish.jersey.media jersey-media-json-jackson 2.5.1  

而已。 除此之外,您不需要包含任何其他内容以及您正在使用的相关Jersey文库。

我真的希望这可以帮助别人节省数小时的时间来解决这个问题。

我有同样的问题,我修复了删除所有json依赖项并添加com.owlike genson 0.99

我知道这是一个老问题,但我遇到了这些问题并尝试了上述所有解决方案,但不幸的是,他们都没有帮助我。 我发现,类MediaType是在两个不同的jar中定义的,在构建jar时,它采用了在另一个类中定义的类(在我的例子中,是glassfish jar)。 删除另一个jar后(您也可以排除特定部分),问题就解决了

当使用jersey-bundle-1.19.1.jar(非maven)时,我不得不删除它:

  com.sun.jersey.api.json.POJOMappingFeature true  

来自web.xml文件。

我知道文档表明这一部分是必要的,但令人惊讶的是它是问题的原因。

对于新版本的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/

  org.glassfish.jersey.containers jersey-container-servlet 2.0 provided    org.glassfish.jersey.core jersey-client 2.0 provided  

还要检查post方法的实际类型参数。

还有gson作为依赖,我应该使用JSONObject(来自Jersey-Json的Jettison)而不是JsonObject(gson),这导致了相同的exception。

在POM.xml中包含此依赖项并运行Maven – > Update

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

我试着下载以下jar库:

  • 来自MVNrepository的 jersy-json.jar 1.19版,
  • 来自MVNrepository的 gson版本0.99
  • 来自MVNrepository的 jersey-media-json-jackson-2.15
  • 来自java2s.com的 jersey-bundle-1.8

当我下载gson 0.99时我的rest服务工作得很好。