JAX-RS NoMessageBodyWriterFoundFailure

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

@GET @Produces (MediaType.APPLICATION_JSON) public List  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)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注释,因此需要编译器擦除的底层类型信息。

您错过了如下所述的库:

这是解决方案

这意味着您在类路径中缺少JSON库。 jackson是我正在使用的,所以将它添加到你的pom.xml将有助于:

  org.glassfish.jersey.media jersey-media-json-jackson 2.10.1