【问题标题】:Trouble with REST/jersey and JSONREST/jersey 和 JSON 的问题
【发布时间】:2015-02-19 09:04:11
【问题描述】:

我在 REST / jersey 中有一个 JSON 异常。

我收到了javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class de.xxx, and Java type class de.xxx, and MIME media type application/json was not found

我收到了消息:

ERROR ContainerResponse - The registered message body writers compatible with the MIME media type are:
application/json ->
  com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App
  com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$App
  com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$App
  com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App
  com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App
*/* ->
  com.sun.jersey.core.impl.provider.entity.FormProvider
  com.sun.jersey.core.impl.provider.entity.StringProvider
  com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
  com.sun.jersey.core.impl.provider.entity.FileProvider
  com.sun.jersey.core.impl.provider.entity.InputStreamProvider
  com.sun.jersey.core.impl.provider.entity.DataSourceProvider
  com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
  com.sun.jersey.core.impl.provider.entity.ReaderProvider
  com.sun.jersey.core.impl.provider.entity.DocumentProvider
  com.sun.jersey.core.impl.provider.entity.StreamingOutputProvider
  com.sun.jersey.core.impl.provider.entity.SourceProvider$SourceWriter
  com.sun.jersey.server.impl.template.ViewableMessageBodyWriter
  com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONWithPaddingProvider
  com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
  com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General

配置似乎没问题。我的依赖项中也有“jersey-json”。

有没有人知道:出了什么问题。

【问题讨论】:

    标签: java json rest jersey jersey-1.0


    【解决方案1】:

    您可以使用 genson lib 将您的类序列化和反序列化为 json。

    Genson genson = new Genson();
    YourClass obj = genson.deserialize(json.toString(), YourClass.class);
    String strJson = genson.serialize(obj);
    

    通过这种方式,您可以在实体中返回一个 POJO。

    我通常用来处理 ret/jersey 的库是这样的:

        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>1.17.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-servlet</artifactId>
            <version>1.17.1</version>
        </dependency>
        <dependency>
            <groupId>com.owlike</groupId>
            <artifactId>genson</artifactId>
            <version>1.0</version>
        </dependency>
    

    【讨论】:

    • 没关系。但是您必须自己在代码中测试所需的 mimetype。比如:'if(xml){ do something.. else(json){ make genson }' jersey-json 自动生成。
    • 我在方法中用注解定义了mime类型。你想自动完成吗?
    • 我也使用注释。我的代码:@GET @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) public Response listClusters(@QueryParam(ClusterFilter.NODE) String node,....
    • 多么混乱!为什么不尝试创建一个返回 POJO 的私有方法,然后创建两个仅调用私有方法并以正确方式返回对象的方法(一个用于 xml,另一个用于 Json)?
    • 这是一种可能性。我用 jersey-json 做到了。它更智能,并且可以与旧版本一起使用。
    【解决方案2】:

    将 JacksonFeature.class 注册到资源配置或应用程序类型中的提供者列表。在你的类路径中有 jersey jackson 库之后一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-08
      • 2015-01-27
      • 2013-09-25
      • 2014-11-15
      • 1970-01-01
      相关资源
      最近更新 更多