我发现了一些我无法理解的奇怪行为。
我测试了4个类似的例子:
1
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response produce() {
List<Book> books = Arrays
.asList(new Book[] {
new Book("aaa", "AAA", "12345"),
new Book("bbb", "BBB", "09876")
});
return Response.ok(books).build();
}
2
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Book> produce() {
List<Book> books = Arrays
.asList(new Book[] {
new Book("aaa", "AAA", "12345"),
new Book("bbb", "BBB", "09876")
});
return books;
}
3
@GET
@Produces(MediaType.APPLICATION_XML)
public List<Book> produce() {
List<Book> books = Arrays
.asList(new Book[] {
new Book("aaa", "AAA", "12345"),
new Book("bbb", "BBB", "09876")
});
return books;
}
4
@GET
@Produces(MediaType.APPLICATION_XML)
public Response produce() {
List<Book> books = Arrays
.asList(new Book[] {
new Book("aaa", "AAA", "12345"),
new Book("bbb", "BBB", "09876")
});
return Response.ok(books).build();
}
在#1、#2、#3 中一切正常,但第 4 个示例抛出:
Could not find MessageBodyWriter for response object of type: java.util.Arrays$ArrayList of media type: application/xml.
我在 Wildfly 9 上运行它,我想知道它是否与 RestEasy 或 JaxRS 一般相关?我知道我可以通过在 GenericEntity 中包装集合来修复它,但我不理解这种不一致的行为。
最佳答案
问题是缺少类型信息。这是处理 XML 序列化的 JAXB 所必需的。
1 和 2 之所以有效,是因为 Jackson 被用于 JSON,它通常不需要知道类型信息,因为它只是内省(introspection)属性。
3 之所以有效,是因为类型信息是通过方法返回类型获知的。
4 不起作用,因为没有类型信息。它被 type erasure 删除了.那就是GenericEntity
来救援。它存储类型信息。
Normally type erasure removes generic type information such that a
Response
instance that contains, e.g., an entity of typeList<String>
appears to contain a rawList<?>
at runtime. When the generic type is required to select a suitableMessageBodyWriter
, this class may be used to wrap the entity and capture its generic type.
关于java - JAXRS/RestEasy 中的@Produces 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35039294/