【问题标题】:WildFly vs. Payara JSON response - what is standard behavior?WildFly 与 Payara JSON 响应 - 什么是标准行为?
【发布时间】:2017-01-17 10:46:29
【问题描述】:

在一个小型演示 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)(或设置器,出于功能设计原​​因我省略了)之后,它起作用了。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的见解。您能否告诉我或指导我是否在响应中使用 Java 对象并让绑定库进行转换或手动构建 JsonObjects 的建议?
    • 如果您想兼容 Java EE,最直接的方法是使用 JSON 处理 (JsonObjects) 手动转换为 JSON。但是,您可以使用这种技术创建一个通用转换器,并将其用作自定义 JAX-RS MessageBodyWriter。下面是一个 MessagebodyWriter converting to XML using JAXB 开始的示例。
    • 好的,那么我想,我会在适当的地方使用 JAX-B 映射,并希望 Java EE 8.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 2021-12-14
    • 2013-05-02
    • 2014-03-04
    • 1970-01-01
    • 2019-06-06
    相关资源
    最近更新 更多