WildFly与Payara JSON的回应 - 什么是标准行为?

时间:2017-01-17 10:46:29

标签: java jax-rs java-ee-7 wildfly-10 payara

在一个小型演示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)(或者因为功能设计原​​因而无法设置的setter)之后,它就可以了。

所有这些让我想到了两个问题:

  • 为什么行为不同,哪个容器做了非标准或另外的事情?
  • 是否有推荐的方法可以使用我的Book类等数据对象作为响应并让它自动转换为JSON(当然还有另外的http响应代码)或者像许多示例中所示,而是手动构建JSON响应对象?

1 个答案:

答案 0 :(得分:4)

不幸的是,在Java EE中尚未定义Java对象到/从JSON的映射,因此WildFly和Payara Server行为根据定义并非标准。它计划由JSON-Binding JSR定义,它将包含在Java EE 8中。大多数实现现在都使用JAX-B进行映射,但这是为Java和XML之间的映射而设计的。为JSON工作没有问题。

默认情况下,Payara Server使用Moxy映射到JSON或从JSON映射。例如,如果您将Jackson添加到应用程序并将JacksonFeature添加到JAX-RS类中,则可以强制使用Jackson:Force Glassfish4 to use Jackson instead of Moxy

如果您希望应用程序始终以标准方式运行,则需要将JAX-RS配置为使用您自己的MessageBodyWriter/Reader