繁体   English   中英

JAX-RS NoMessageBodyWriterFoundFailure

[英]JAX-RS NoMessageBodyWriterFoundFailure

我的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.sorry,我的英语不好。

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

@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在于两个提供程序之间的根本区别:

  • 前者(杰克逊)依靠JavaBean模型,发现要序列化的对象的属性,不需要类型信息
  • 后者(jettyson)依赖于JAXB注释,因此它需要由编译器擦除的基础类型信息。

您缺少这里描述的库:

这是解决方案

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

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.10.1</version>
</dependency>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM