Jersey:找不到Java类和MIME mediatype应用程序/ json的消息正文编写器

时间:2012-11-18 10:39:16

标签: eclipse json jersey message mime

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

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

Tomcat Webserver IDE:Eclipse 我正在使用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;


    }
}

9 个答案:

答案 0 :(得分:47)

尝试将Genson库添加到类路径http://owlike.github.io/genson/。 它是json&lt;&gt; java流和数据绑定api。它与平针织物完美结合,为您提供运行,您需要0配置。 Jersey检测到该库位于您的类路径中,并通过委派给Genson来启用json映射。

答案 1 :(得分:14)

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

答案 2 :(得分:11)

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

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

答案 3 :(得分:3)

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

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

  <!-- other dependencies -->

</dependencies>

答案 4 :(得分:2)

在Package Explorer中检查Maven Dependencies,如果你没有看到或jersey-bundle-1.8.jar,那么你可能只指定了jersey-server。将pom.xml中的依赖项更改为jersey-bundle,它应该可以正常工作。

答案 5 :(得分:1)

泽西岛2.4:我也遇到了这个问题,发布这个问题可以帮助别人。我从Jersey API规范中选择了JSON集成:(https://jersey.java.net/documentation/latest/user-guide.html#json

我使用Jettison与泽西与JSON集成。但即使在添加了所有库之后我也收到了错误:找不到Java类和MIME mediatype应用程序/ json的消息体编写器

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

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

答案 6 :(得分:0)

删除@Produces(MediaType.APPLICATION_JSON);并使用JSONLibraries.zip文件将数据转换为JSON和从JSON转换数据。它完美地工作。上面代码的问题是它使用maven和jackson组合。因此,当您仅使用运动衫时,无法找到APPLICATION_JSON。 我和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()));
    }
}

答案 7 :(得分:0)

这个问题刚才被问过,但对于那些阅读,请注意,jersey servlet容器有它自己的POJO映射器。

通过在web.xml中添加以下内容来启用它

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

我确实注意到球衣和genson地图对象的一些差异。例如,如果一个类有一个A类型的字段,它被设置为一个B的实例,它扩展了A,那么genson就不能正确地序列化B,而jersey就是这样。

答案 8 :(得分:0)

上述问题将通过使用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转换为string会很好,但是会产生不希望的输出,因为在响应中您会得到一个字符串而不是json。搭配杰克逊图书馆,这将非常容易。

注意:只有在类实现了Serializable Interface的情况下,Jackson才会将响应转换为json。因此,如果要发送JSONObject,则最好发送JSONObject列表。