在一个小型演示 JAX-RS 应用程序中,我有以下 POJO:
public class Book {
private String title;
private String author;
private int year;
// only this constructor, no default
public Book(String title, String author, int year) {
this.title = title;
this.author = author;
this.year = year;
}
// getters for members, no setters
...
}
我在 REST 操作中将此用作响应:
@GET
@Path("books")
@Produces(MediaType.APPLICATION_JSON)
public List<Book> getBooks() {
List<Book> books = new ArrayList<>();
// add some books via Book constructor
...
return books;
}
该应用程序在 WildFly 10 上完美运行,生成图书对象的 JSON 输出。
在最近的 Payara 上部署了同样的战争,在服务器日志中给了我一个异常:
MessageBodyWriter not found for media type=application/json
在添加了默认构造函数和@XmlAccessorType(XmlAccessType.FIELD)
(或设置器,出于功能设计原因我省略了)之后,它起作用了。
这一切让我想到了两个问题:
- 为什么行为不同,哪个容器做一些非标准或额外的事情?
- 是否有推荐的方法可以使用我的 Book 类等数据对象作为响应并让它自动转换为 JSON(当然还有一个额外的 http 响应代码),或者像许多示例中所示的那样,而不是手动构建 JSON 响应对象?