Java WildFly vs.Payara JSON响应-什么是标准行为?

Java WildFly vs.Payara JSON响应-什么是标准行为?,java,jax-rs,java-ee-7,wildfly-10,payara,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;

在一个小型演示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;
}
在添加了默认构造函数和
@xmlacessortype(xmlacesstype.FIELD)
(或setter,我出于功能设计的原因使用了setter)之后,它工作了

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

  • 为什么行为不同?哪个容器做了一些非标准或附加的事情
  • 有没有一种推荐的方法可以使用诸如MyBook类之类的数据对象作为响应,并让它自动转换为JSON(当然还有一个额外的http响应代码),或者像许多示例中所示的那样,而不是手动构建JSON响应对象

不幸的是,Java EE中尚未定义Java对象与JSON之间的映射,因此从定义上讲,WildFly和Payara服务器行为都不是标准的。它计划由JSON绑定JSR定义,JSN绑定JSR将包含在JavaEE8中。目前的大多数实现都使用JAX-B进行映射,但这是为Java和XML之间的映射而设计的,对于JSON来说没有问题就无法工作

默认情况下,Payara服务器使用Moxy映射到JSON或从JSON映射。您可以强制使用Jackson,例如,如果您将Jackson添加到应用程序中,并将
JacksonFeature
添加到JAX-RS类中:


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

不幸的是,Java EE中尚未定义Java对象与JSON之间的映射,因此,根据定义,WildFly和Payara服务器的行为都不是标准的。它计划由JSON绑定JSR定义,JSN绑定JSR将包含在JavaEE8中。目前的大多数实现都使用JAX-B进行映射,但这是为Java和XML之间的映射而设计的,对于JSON来说没有问题就无法工作

默认情况下,Payara服务器使用Moxy映射到JSON或从JSON映射。您可以强制使用Jackson,例如,如果您将Jackson添加到应用程序中,并将
JacksonFeature
添加到JAX-RS类中:


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

,感谢您的见解。您还可以告诉我或指导我关于是否在响应中使用Java对象并让绑定库进行转换或手动构建JSONObject的建议吗?如果您希望与Java EE兼容,最直接的方法是使用JSON处理(JSONObject)手动转换为JSON。但是,您可以使用此技术创建一个通用转换器,并将其用作自定义JAX-RS
MessageBodyWriter
。下面是一个开始使用JAX的例子。好的,那么我想,我会在适当的地方使用JAX-B映射,并希望使用JavaEE8。感谢您的见解。您还可以告诉我或指导我关于是否在响应中使用Java对象并让绑定库进行转换或手动构建JSONObject的建议吗?如果您希望与Java EE兼容,最直接的方法是使用JSON处理(JSONObject)手动转换为JSON。但是,您可以使用此技术创建一个通用转换器,并将其用作自定义JAX-RS
MessageBodyWriter
。下面是一个开始使用JAX的例子。好吧,那么我想,我会在适当的地方使用JAX-B映射,希望使用JavaEE8。
MessageBodyWriter not found for media type=application/json