【问题标题】:Jersey: A message body writer for Java Class and MIME mediatype application/json was not found泽西岛:找不到 Java 类和 MIME 媒体类型应用程序/json 的消息正文编写器
【发布时间】:2012-11-06 12:34:36
【问题描述】:

在试图弄清楚我的问题是什么之后,我终于决定问你如何解决我的问题。我见过不同的人有同样的问题,我尝试了他们被建议做的所有事情,但对我的问题没有任何帮助。所以基本上我有一个使用 Jersey 构建的 RESTful 服务。对于我的客户,我想以 JSON 格式返回一个对象。我阅读了不同的教程并决定使用 jersey-json-1.8 库是有意义的。我像往常一样将所有内容添加到我的项目中并尝试运行它,但每次我调用服务时(通过获取请求 atm。)我收到 HTTP 错误代码 500(内部服务器错误)并且我的服务器响应没有消息正文作家可以找到。 如果我返回 XML,它工作得很好,一切都很好。我还尝试将 jersey-json-1.8.jar 复制到我的 Tomcat lib 文件夹,因为我必须使用我正在使用的 mysql lib 执行此操作,但它也没有帮助。 如果您能帮助我使这些东西正常工作,我将非常高兴! 如果您需要更多信息,请发表评论,我会尽快提供:)

我的项目设置是: 3 不同的包装 1. 我的 RESTfulServices 2. 我的 Java 工作,我处理 SQL 连接等。 3. 一个包,其中存储了我需要使用的所有模型,并且我想以 JSON 格式返回(在我的示例中为试驾路线)

Tomcat 网络服务器 IDE:日食 我正在使用 Maven

无论我以何种方式或如何尝试返回对象,它都无法正常工作,而且我不断收到错误消息:

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.mykong.models.Teststrecke, and Java type class com.mykong.models.Teststrecke, and MIME media type application/json was not found

编辑: 这是我的 JSON 服务方法

@Path("/hellojson")
public class JSONService {


    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public ArrayList<Route> getJSONMsg()  
    {

        Route ts = new Route();
        ts.setId(1);
        ts.setName("HelloWorld");


        Route ts2 = new Route();
        ts2.setId(2);
        ts2.setName("HelloWorld");


        ArrayList<Route> availRoutes = new ArrayList<Route>();
        availRoutes.add(ts);
        availRoutes.add(ts2);


        return availRoutes;


    }
}

【问题讨论】:

标签: eclipse json jersey message mime


【解决方案1】:

尝试将 Genson 库添加到您的类路径 http://owlike.github.io/genson/。 它是一个 jsonjava 流和数据绑定 api。它与球衣很好地集成在一起,让您运行您需要 0 配置。 Jersey 检测到该库在您的类路径中,并通过委托给 Genson 来启用 json 映射。

【讨论】:

  • +1 表示解决方案。但我真的很想知道为什么没有记录。我真的很生气 jersey 没有记录这一点。
  • @Akshay 我同意。 Jersey 是第一个在我尝试使用时真正让我生气的软件项目。他们的文档很糟糕。前两章(是的,他们需要“章节”!)是关于设置 Maven。
  • 使用genson时不需要jersey-json。也可以从方法定义中删除 @Consumes:(MediaType.APPLICATION_JSON)。
【解决方案2】:

在您的 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>

【讨论】:

  • 其实只有genson就够了,不需要jersey-json
【解决方案3】:

添加以下依赖项解决了我的问题。根据@eugen,我尝试添加Genson 依赖项,这有助于消除异常,但是我的服务器由于某种原因抛出了 400 错误请求。 Genson 似乎无法正确传输 json 请求。但下面的依赖工作正常。希望它对其他人有所帮助,因为这个问题让我发疯了!

<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.3.0</version>
</dependency>

【讨论】:

  • 您使用的是什么版本的 Genson?
  • 看起来很奇怪,您应该在邮件列表中报告它并提供更多关于您遇到的问题的详细信息
  • 使用 jackson-jaxrs-json-provider 2.9.1 版为我工作
  • 也尝试使用 genson 1.4 并在序列化时出现同样的问题。
  • Genson 可能与球衣发生冲突。我的解决方法是stackoverflow.com/questions/12179737/…
【解决方案4】:

jersey-json 依赖项移到 pom.xml 的顶部为我解决了这个问题。

<dependencies>
  <dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.18.1</version>
  </dependency>

  <!-- other dependencies -->

</dependencies>

【讨论】:

    【解决方案5】:

    检查包资源管理器中的 Maven 依赖项,如果您没有看到它或 jersey-bundle-1.8.jar,那么您可能只指定了 jersey-server。将 pom.xml 中的依赖更改为 jersey-bundle,它应该可以工作。

    【讨论】:

      【解决方案6】:

      Jersey 2.4:我也遇到了这个问题,并发布这个以防它对某人有所帮助。我从 Jersey API Specification for JSON Integration 中挑选了这个:(https://jersey.java.net/documentation/latest/user-guide.html#json)

      我使用 Jettison 将 Jersey 与 JSON 集成。但即使在添加了所有库之后,我也得到了错误:找不到 Java 类和 MIME 媒体类型应用程序/json 的消息正文编写器

      这一切都是为了添加正确的库并注册功能> 除了 Jersey 提供的所有其他库之外,我还添加了一个额外的库:jersey-media-json-jettison-2.4.jar。并添加了以下代码来注册 Jettison 功能。

         public class MyApplication extends ResourceConfig{
            public MyApplication() {
                register(JettisonFeature.class);
                packages("org.XXX.XXX.XXX");   
          }
      

      【讨论】:

        【解决方案7】:

        这个问题是不久前提出的,但是对于那些正在阅读的人,请注意 jersey servlet 容器有它自己的 POJO 映射器。

        通过将以下内容添加到您的 web.xml 来启用它

        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
        

        我确实注意到 jersey 和 genson 映射对象的方式存在一些差异。例如,如果一个类有一个 A 类型的字段,该字段设置为 B 的一个实例,该实例扩展 A,genson 将无法正确序列化 B,而 jersey 可以。

        【讨论】:

        • Genson 可以“正确”序列化它,默认情况下它使用编译时间信息。要使用运行时信息,请使用 GensonBuilder.useRuntimeType(true) 参见 owlike.github.io/genson/Documentation/Configuration
        • 感谢您的信息。与 jersey 的 mapper 相比,使用 genson 有什么好处?
        • 首先没有jersey mapper,它只是一个使用jackson的模块。人们转向它的主要原因是它只适用于开箱即用的球衣。您应该查看该网站,看看是否有您感兴趣的功能并自行判断其好处:) 快速列表:支持带有鼓励不变性的参数的构造函数、jaxb 注释、scala、实现 jsr353、多态类型的 ser/de (在不丢失 deser 中的具体类的情况下)、出色的可配置性和模块化来插入新组件等等......
        【解决方案8】:

        删除@Produces(MediaType.APPLICATION_JSON);并使用 JSONLibraries.zip 文件将您的数据与 JSON 相互转换。它工作得很好。上面代码的问题是它使用了 maven 和 jackson 的组合。因此,当您仅使用运动衫时,找不到 APPLICATION_JSON。 我使用 to/from JSON 转换的东西,它给了我同样的错误,我尝试了这个解决方案,它工作正常。

        代码:

        @Path("/hellojson")
        public class JSONService {
        
            @GET
            public ArrayList<Route> getJSONMsg()  
            {
        
                Route ts = new Route();
                ts.setId(1);
                ts.setName("HelloWorld");
        
                Route ts2 = new Route();
                ts2.setId(2);
                ts2.setName("HelloWorld");
        
                ArrayList<Route> availRoutes = new ArrayList<Route>();
                availRoutes.add(ts);
                availRoutes.add(ts2);
        
                return JSONObject.fromObject(availRoutes.toString()));
            }
        }
        

        【讨论】:

          【解决方案9】:

          上述问题将通过使用jackson库而不是genson来解决。

              <dependency>
                  <groupId>org.codehaus.jackson</groupId>
                  <artifactId>jackson-mapper-asl</artifactId>
                  <version>1.9.0</version>
              </dependency>
          
          
              <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
              <dependency>
                  <groupId>com.fasterxml.jackson.core</groupId>
                  <artifactId>jackson-databind</artifactId>
                  <version>2.9.2</version>
              </dependency>
          
              <dependency>
                  <groupId>org.glassfish.jersey.media</groupId>
                  <artifactId>jersey-media-json-jackson</artifactId>
                  <version>2.25</version>
              </dependency>
          

          在我的情况下,genson 在响应中给出了一个空的 json,但如果我们将 json 转换为字符串会很好。但是会创建一个不需要的输出,因为在响应中你会得到一个字符串而不是 json。所以更好与杰克逊图书馆一起去很容易。

          注意:只有当类实现了可序列化接口时,Jackson 才会将您的响应转换为 json。因此,如果您要发送 JSONObject,那么最好发送 JSONObject 列表。

          【讨论】:

            猜你喜欢
            • 2014-06-29
            • 2018-04-20
            • 2018-01-26
            • 2016-04-03
            • 2015-01-21
            • 2014-12-28
            • 2012-08-16
            • 2013-12-05
            • 2016-10-01
            相关资源
            最近更新 更多