1

我的 jax-rs 应用程序的方法:

@GET
@Produces (MediaType.APPLICATION_JSON)
public List <Document> getDocumentList(@HeaderParam("Range") String headerRange) {
int [] range = getRangeFromHeader(headerRange);
return facade.listByRange(range);
}

好好工作。但如果修改:

@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getDocumentList(@HeaderParam("Range") String headerRange) {
   int[] range = getRangeFromHeader(headerRange);
   return Response.ok(
          facade.listByRange(range))
         .header("Content-Range", getContentRangeStr(range)).build();
}

我收到一个错误

...NoMessageBodyWriterFoundFailure: Could not find MessageBodyWriter for response
object of type: java.util.ArrayList of media type: application/json...

服务器 Jboss 7.1.1

请告诉我有什么问题。

PS.对不起我的英语不好。

4

2 回答 2

1

下面的代码片段应该可以解决问题。

@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getDocumentList(@HeaderParam("Range") String headerRange) {
   int[] range = getRangeFromHeader(headerRange);
   return Response.ok(
        new GenericEntity<List<Document>>( (List<Document>)facade.listByRange(range))
         )
         .header("Content-Range", getContentRangeStr(range)).build();
}

匿名GenericEntity子类需要为作者提供正确的类型信息(否则会被编译器删除)。

--编辑

您的代码使用org.jboss.resteasy.resteasy-jackson-provider但不能使用的原因org.jboss.resteasy.resteasy-jettison-provider在于两个提供程序之间的根本区别:

  • 前者(jackson)依赖于JavaBean模型,发现要序列化的对象的属性,不需要类型信息
  • 后者(jettyson)依赖于 JAXB 注释,因此它需要编译器擦除的底层类型信息。
于 2013-09-04T14:36:57.017 回答
0

您缺少此处所述的库:

这是解决方案

这意味着您的类路径中缺少 JSON 库。Jackson 是我正在使用的一个,因此将其添加到您的 pom.xml 将有所帮助:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.10.1</version>
</dependency>
于 2015-04-28T17:48:10.343 回答