WildFly vs. Payara JSON 响应 - 什么是标准行为?
WildFly vs. Payara JSON response - what is standard behavior?
在一个小型演示 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 上部署的完全相同的 war,让我在服务器日志中出现异常:
MessageBodyWriter not found for media type=application/json
添加默认构造函数和 @XmlAccessorType(XmlAccessType.FIELD)
(或 setter,出于功能设计原因我将其省略)后,它起作用了。
所有这些让我想到了 2 个问题:
- 为什么行为不同,哪个容器做了一些非标准或额外的事情?
- 是否有推荐的方法来使用数据对象(例如我的书 class 作为响应并让它自动转换为 JSON(当然还有额外的 http 响应代码)或如图所示在许多示例中,而不是手动构建 JSON 响应对象?
不幸的是,Java 对象 to/from JSON 的映射尚未在 Java EE 中定义,因此根据定义,WildFly 和 Payara Server 行为都不是标准的.它计划由 JSON-Binding JSR 定义,它将包含在 Java EE 8 中。现在大多数实现使用 JAX-B 进行映射,但这是为之间的映射而设计的Java 和 XML 并且 JSON.
没有问题就无法工作
默认情况下,Payara Server 使用 Moxy 映射 to/from JSON。例如,如果您将 Jackson 添加到您的应用程序并将 JacksonFeature
添加到 JAX-RS 类 中,您可以强制使用 Jackson:Force Glassfish4 to use Jackson instead of Moxy
如果您希望您的应用程序始终以标准方式运行,您需要配置 JAX-RS 以使用您自己的 MessageBodyWriter/Reader
。
在一个小型演示 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 上部署的完全相同的 war,让我在服务器日志中出现异常:
MessageBodyWriter not found for media type=application/json
添加默认构造函数和 @XmlAccessorType(XmlAccessType.FIELD)
(或 setter,出于功能设计原因我将其省略)后,它起作用了。
所有这些让我想到了 2 个问题:
- 为什么行为不同,哪个容器做了一些非标准或额外的事情?
- 是否有推荐的方法来使用数据对象(例如我的书 class 作为响应并让它自动转换为 JSON(当然还有额外的 http 响应代码)或如图所示在许多示例中,而不是手动构建 JSON 响应对象?
不幸的是,Java 对象 to/from JSON 的映射尚未在 Java EE 中定义,因此根据定义,WildFly 和 Payara Server 行为都不是标准的.它计划由 JSON-Binding JSR 定义,它将包含在 Java EE 8 中。现在大多数实现使用 JAX-B 进行映射,但这是为之间的映射而设计的Java 和 XML 并且 JSON.
没有问题就无法工作默认情况下,Payara Server 使用 Moxy 映射 to/from JSON。例如,如果您将 Jackson 添加到您的应用程序并将 JacksonFeature
添加到 JAX-RS 类 中,您可以强制使用 Jackson:Force Glassfish4 to use Jackson instead of Moxy
如果您希望您的应用程序始终以标准方式运行,您需要配置 JAX-RS 以使用您自己的 MessageBodyWriter/Reader
。