【问题标题】:Jersey + Json media type application/json was not foundJersey + Json 媒体类型 application/json 未找到
【发布时间】:2012-08-24 04:04:27
【问题描述】:

我正在尝试简单的 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();
    }

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

【问题讨论】:

    标签: java json jersey jax-rs


    【解决方案1】:

    jersey-bundle-1.8.jar 解决了这个问题

    【讨论】:

    • 我在 pom.xml 中包含了工件“jersey-json”,它解决了我的问题。在非 maven 项目中,您可以通过在类路径中包含“jersey-json.jar”文件来解决此问题。
    • 添加“jersey-json”API 解决了这个问题。 com.sun.jerseyjersey-bundle1.18.1
    • gradle : 编译 "com.sun.jersey:jersey-bundle:1.18.1"
    • @Ajay - 请在您的回答中提及 jersey 捆绑包应该存在而没有任何其他 jersey 依赖项(客户端、服务器、核心等)。忘记其他 jersey 依赖项可能会产生未知行为 - 它发生在我身上。没有报告错误,但由于某种原因,对象未序列化,并且在请求中发送了空正文。
    • 我遇到了同样的问题,我是因为我没有把我的 'response(entity.toString).build.' 'toString' 是关键
    【解决方案2】:

    通过将以下内容添加到我的 pom.xml 来修复问题:

        <dependency>
            <groupId>com.owlike</groupId>
            <artifactId>genson</artifactId>
            <version>0.99</version>
        </dependency>
    

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

    【讨论】:

    • 发送POST请求时使用genson导致空体请求。
    【解决方案3】:

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

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

    【讨论】:

    • 问题已通过 jersey-bundle-1.8.jar 文件修复
    【解决方案4】:

    添加如下依赖解决问题

    "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】:

      如果您不依赖于 jackson,您可以尝试使用 Genson 库 http://owlike.github.io/genson/。 你只需要你的类路径中的 lib 并且每件事都应该在没有任何额外代码的情况下工作。您甚至不必在 web.xml 中使用 POJOMappingFeature 也不必在您的 pojo 上添加 @XMLRootElement!

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

      【讨论】:

      • 问题已通过 jersey-bundle-1.8.jar 文件修复
      【解决方案6】:

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

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

      我也在运行 Jersey 2,这是另一个问题,因为这个问题的许多公认答案只谈论 Jersey 1,当我第一次尝试解决这个问题时,它非常令人困惑。

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

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

      2. 您必须在包含您的 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】:

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

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

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

        【讨论】:

          【解决方案8】:

          使用 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 文件。

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

          【讨论】:

            【解决方案9】:

            我遇到了同样的问题,我通过删除所有 json 依赖项并添加来修复它 com.owlike 根森 0.99

            【讨论】:

              【解决方案10】:

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

              【讨论】:

              • 有道理。我们遇到了同样的问题。它适用于 jersey-bundle 但是,真正的问题是 jersey 模块之间的依赖冲突。
              【解决方案11】:

              我尝试下载以下 jar 库:

              当我下载 gson 0.99 时,我的休息服务运行良好。

              【讨论】:

                【解决方案12】:

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

                【讨论】:

                  【解决方案13】:

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

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

                  【讨论】:

                    【解决方案14】:

                    在您的 POM.xml 中包含此依赖项并运行 Maven -> 更新

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

                    【讨论】:

                      【解决方案15】:

                      我对 1.19.4 球衣也有同样的问题。通过添加修复它

                      compile group: 'com.fasterxml.jackson.jaxrs', name: 'jackson-jaxrs-json-provider', version: '2.10.0.pr1'
                      

                      对依赖进行分级。

                      谢谢, 普拉文·R.

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2015-12-13
                        • 1970-01-01
                        • 2015-08-05
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2014-03-20
                        • 2012-08-16
                        相关资源
                        最近更新 更多