我可以让Jersey在全局/默认情况下使用自然JSON表示法吗?

met*_*att 4 java json jax-rs jersey

我正在使用Jersey为服务构建REST API.我希望能够接受并返回JSON和XML,并且主要使用它,但我不喜欢Jersey喜欢吐出的JSON的默认"映射"风格.

我知道更新的"自然"符号(来自http://jersey.java.net/nonav/documentation/latest/json.html,我会详细引用它,因为它显然存在默认"映射"的问题符号):

在使用映射的JSON表示法一段时间后,很明显,需要手动配置所有各种事情可能有点问题.为了避免手动工作,在Jersey版本1.0.2中引入了一种新的,自然的JSON表示法.使用自然符号,Jersey会自动确定需要处理的各个项目,因此您无需进行任何类型的手动配置.Java数组和列表映射到JSON数组,即使对于单元素情况也是如此.Java数字和布尔值正确映射到JSON数字和布尔值,你不需要打扰XML属性,就像在JSON中一样,它们保留原始名称

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

我也尝试实现自己的ContextResolver,它应用了我从Java代码实例化的JSONJAXBContext,我可以在其中应用JSONConfiguration.natural()(这个例子就像这个答案).这是有效的,但仅适用于我在该代码中明确列出的类型,并传递给JSONJAXBContext构造函数.这个额外的代码不仅可以编写和维护,而且如果我添加更多的数据类也会更改,但它不适用于像List这样的东西.

有没有办法告诉泽西岛只使用自然符号而不是映射符号,总是和所有类型?

met*_*att 5

我从来没有找到我在这里问的实际问题的答案,但我发现了一个简单的3步过程,它完成了我想要的最终结果:

  • Jackson添加到我的项目中
  • 配置Jersey以启用FEATURE_POJO_MAPPING
  • 因为事实证明这么简单,所以在头上拍了几下头.

泽西文档突出(它在文档页面我的问题链接的第一个例子),但并没有说明到底是什么意思,并从方式,文件提出了信息我想这个选项(5.1提到了这一点POJOMappingFeature/FEATURE_POJO_MAPPING ,"POJO支持")与选项5.2("基于JAXB的JSON支持")不一致,这听起来更像我想要的.所以在尝试启用FEATURE_POJO_MAPPING之前我尝试了很多其他的东西.

但是一旦我尝试了它,它就像我想要的那样工作,而且我没有必要回头看.

这样做的另一个好处是,与Jersey的本机JSON处理实现相比,在客户端传递伪造JSON内容的情况下,Jackson会生成更好的错误消息.