JAX-RS NoMessageBodyWriterFoundFailure

时间:2013-09-04 11:49:12

标签: java jboss jax-rs resteasy

方法 我的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因为我的英语不好。

2 个答案:

答案 0 :(得分: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注释,因此它需要基础类型信息,由编译器擦除。

答案 1 :(得分:0)

您错过了如下所述的库:

Here is the solution

  

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

NSString *temp = @"jump jump jump jump jump jump";

CGSize = CGSizeMake(30,30);
UIFont *font = [UIFont fontwithName:@"helviticaNueue" fontSize:18];