【问题标题】:Can I get Jersey to use natural JSON notation globally/as default?我可以让 Jersey 全局/默认使用自然 JSON 表示法吗?
【发布时间】:2012-02-18 08:41:18
【问题描述】:

我正在使用 Jersey 为服务构建 REST API。我希望能够同时接受和返回 JSON 和 XML,并且大多数情况下都能正常工作,但我不喜欢 Jersey 喜欢吐出的 JSON 的默认“映射”风格。

我知道较新的“自然”表示法(来自http://jersey.java.net/nonav/documentation/latest/json.html,我将详细引用它,因为它使默认“映射”表示法的问题显而易见):

在使用映射 JSON 表示法一段时间后,很明显,一个 需要手动配置所有各种东西可能有点 有问题的。为了避免手动工作,一种新的、自然的 JSON 表示法 在泽西岛版本 1.0.2 中引入。使用自然符号,泽西岛 将自动找出单个项目需要如何 已处理,因此您无需进行任何手动操作 配置。 Java 数组和列表映射到 JSON 数组,甚至 对于单元素情况。 Java 数字和布尔值是正确的 映射为 JSON 数字和布尔值,您无需费心 使用 XML 属性,如在 JSON 中,它们保留原始名称

并且想在任何地方使用它,但我无法弄清楚如何使用它。我正在通过 Tomcat 的 XML 配置文件实例化/配置 Jersey——使用我认为与 servlet/servlet-class/init-param 标签的正常舞蹈——但我无法找到关于它是否或如何的文档可以从那里指定 JSONConfiguration 选项。

我还尝试实现我自己的 ContextResolver,它应用我从 Java 代码实例化的 JSONJAXBContext,我可以在其中应用 JSONConfiguration.natural()(这个例子看起来像 this answer)。这有效,但仅适用于我在该代码中明确列出并传递给 JSONJAXBContext 构造函数的类型。这个额外的代码不仅需要编写和维护,而且如果我添加更多数据类会发生变化,而且它不适用于 List 之类的东西。

有没有办法告诉 Jersey 只使用自然表示法而不是映射表示法,始终适用于所有类型?

【问题讨论】:

    标签: java json jersey jax-rs


    【解决方案1】:

    我从来没有找到我在这里提出的实际问题的答案,但我找到了一个简单的 3 步过程,可以实现我想要的相同最终结果:

    • Jackson 添加到我的项目中
    • 配置泽西岛以启用FEATURE_POJO_MAPPING
    • 在自己的头上拍了几下,因为这很容易。

    泽西岛文档突出地提到了这个 POJOMappingFeature/FEATURE_POJO_MAPPING (这是我在问题中链接的文档页面中的第一个示例),但没有准确描述它的含义,并且从文档呈现其信息的方式我认为选项(5.1,“POJO 支持”)与选项 5.2(“基于 JAXB 的 JSON 支持”)不一致,这听起来更像我想要的。因此,在尝试启用 FEATURE_POJO_MAPPING 之前,我尝试了很多其他方法。

    但是一旦我尝试过,它就完全按照我的意愿工作了,而且我不必回头。

    与 Jersey 的原生 JSON 处理实现相比,这样做的一个附带好处是,在客户端传递虚假 JSON 内容的情况下,Jackson 生成的错误消息要好得多。

    【讨论】:

    • 你的意思是你已经将web.xml中的“com.sun.jersey.api.json.POJOMappingFeature”设置为true并在你的项目中包含了jackson库吗?我已经尝试过了,但它没有改变任何东西。我找到的唯一解决方案是创建一个 ContextResolver,在 Application 子类中注册它(@Provider 注释不会自动找到它)并在 ContextResolver 中列出我的所有类。 IE。您已经在问题中描述并且您不喜欢的解决方案。您能否提供更多详细信息,您是如何解决这个问题的?
    猜你喜欢
    • 2023-03-24
    • 2021-02-04
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多