对于 Jersey 2.17 项目,我们还需要 JacksonFeature.class 吗?

Do we still need JacksonFeature.class for Jersey 2.17 projects?

我一直想知道 Jersey 2.17 是否仍然需要 JacksonFeature.class。我看不出 JacksonFeature.class 是否注册的代码之间的输出有任何区别。

然后,我从 codingpedia codingpedia 中 fork 了一个代码,删除了 JacksonFeature.class,升级到 Spring 4.1.2 和 jersey 2.17,更新了代码,测试仍然通过。

所以我创建了一个非常简单的 Web 服务来再次测试它 github link,考虑到删除所有移动部件并且仍然有效。那么我们还需要注册JacksonFeature吗?

是的,我不知道他们为什么使用 Jersey 2.9 的教程,但是对于 jersey-media-json-jackson 工件,他们使用的是 2.4.1。通常,您应该保持 Jersey(相关工件)版本相同。在实际的Github Project中,作者把这个改为使用项目的${jersey.version}(也就是2.14),这样更有意义。

但要回答您的主要问题,从 2.9 版开始,jersey-media-json-jackson 模块将参与 AutoDiscoverable classpath scanning, which involves Java's Service Provider mechanism。您可以通过来回切换此模块的 2.8 版本和 2.9(向上)版本来查看此更改。您将在 META-INF/services 文件中看到 2.9 版(及更高版本)中的文件 org.glassfish.jersey.internal.spi.Autodiscoverable(其中列出了 JacksonAutoDiscoverable 实现)。有了这个,该功能不需要明确配置,除非禁用自动发现功能(可以明确地这样做)。


为了完整起见,当您在类路径上有 MOXy,并且您没有明确注册 Jackson 功能时,将使用 MOXy,因为 MOXy 是默认提供程序。即使您可能没有明确依赖 MOXy,但在使用 Glassfish 服务器的情况下,它具有 MOXy 工件,在这种情况下,我们可以显式注册 Jackson 功能,自动禁用 MOXy,或者我们可以显式禁用MOXy 属性 ServerProperties.MOXY_JSON_FEATURE_DISABLE 设置为 true