【问题标题】:How to change Jackson version in JAX-RS app (WebSphere Liberty)如何在 JAX-RS 应用程序(WebSphere Liberty)中更改 Jackson 版本
【发布时间】:2017-01-16 06:02:08
【问题描述】:

我正在将一个 JAX-RS 应用程序从 WebSphere 8.0 迁移到 WebSphere Liberty 8.5.5。

在 WebSphere 8.0 中,Jackson 由 WebSphere 提供。我可以在AppServer\plugins\ 目录中找到jackson-core-asl-1.9.12.jarjackson-jaxrs-1.9.12.jarjackson-mapper-asl-1.9.12.jarjackson-xc-1.9.12.jar 文件。

在新的应用程序服务器 (WebSphere Liberty) 中,我收到以下异常:org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "myPropertyName"。我认为发生此异常是因为序列化类上的注释 @JsonIgnoreProperties(ignoreUnknown = true) 不起作用。我猜这是因为 WebSphere Liberty 8.5.5 提供了旧版本的 Jackson。

我尝试在我的应用程序中部署我需要的 Jackson 版本, 但它没有帮助(我仍然有例外)。如何让 WebSphere Liberty 使用我需要的 Jackson 版本?

【问题讨论】:

  • 您好,我知道接受的答案是正确的并且有效。但是您能否更新问题,并提及我必须在共享库中包含哪些所有 jar 才能使用 JACKSON2.2。

标签: jakarta-ee jackson jax-rs websphere websphere-liberty


【解决方案1】:

WebSphere Liberty 将使用您通过 JAX-RS 2.0 指定的 Jackson 版本,但有一些注意事项(我们正在关注)。

A) 您仍然必须明确指定 JSON 提供程序。

B) 您可能会看到带有 16.0.0.2 的 NPE,如下所述:Regiser JacksonJsonProvider in Websphere liberty profile。我们已经按照描述解决了这个问题。最新的测试版没有表现出这种行为,这表明下一次运行时更新也不会。

示例:https://github.com/gameontext/gameon-mediator/blob/6b469d18965673af35129abf3ff987b61af54c88/mediator-app/src/main/java/org/gameontext/mediator/JaxbJsonProvider.java

https://github.com/gameontext/gameon-mediator/blob/6b469d18965673af35129abf3ff987b61af54c88/mediator-app/src/main/java/org/gameontext/mediator/JsonProvider.java

我们的 gradle 构建引入了 jackson 依赖项: https://github.com/gameontext/gameon-mediator/blob/6b469d18965673af35129abf3ff987b61af54c88/mediator-app/build.gradle

而且我们的 server.xml 使用 jaxrs-2.0,但没有做任何类加载器魔法: https://github.com/gameontext/gameon-mediator/blob/6b469d18965673af35129abf3ff987b61af54c88/mediator-wlpcfg/servers/gameon-mediator/server.xml

HTH

【讨论】:

  • 谢谢,在我明确指定 JAX-RS JSON 提供程序并将objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false) 放入其中后,一切正常。我删除了@JsonIgnoreProperties(ignoreUnknown = true) 注释。我不必更改库的版本。
  • 太棒了!很高兴知道这也适用于您。
【解决方案2】:

是的,WebSphere Liberty 使用的 Jackson 版本比传统的 WAS 更旧。我们需要解决这个问题!

同时,您还可以使用 jaxrs-2.0 功能,然后在您的应用程序或共享库中包含较新版本的 Jackson。

Liberty 的 jaxrs-1.1 和 jaxrs-2.0 功能之间的区别之一是 jaxrs-2.0 不公开 Jackson API 包。因此,应用程序的类加载器将无法加载 Liberty 附带的 Jackson 类。这意味着它将从您的应用程序中加载类,而无需执行 parentLast 委托或其他类加载器技巧。

希望这会有所帮助,安迪

【讨论】:

  • 我正在使用 server.xml 中的 jaxrs-2.0 功能。看起来我在运行时的类路径上有 Jackson 1.6.2(由 Liberty 提供!)。
  • 我找到了另一种解决我的问题的方法,但是,如果我切换到 Jackson 2.x,它可能会解决问题。
【解决方案3】:

Alexey,您是否尝试过对 liberty 上部署的应用程序使用 parentLast 加载器方法,以便应用程序类优先。您可以参考此question 以获得更多见解。 IBM 也有相关文档here

【讨论】:

  • 谢谢!我会看看那个问题。
  • 基本上在您的应用程序 EAR 打包中,您必须提到您希望 parent 最后(表示要考虑您的打包库,而不是类加载器加载的默认库)
猜你喜欢
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 2016-09-20
  • 2015-02-16
  • 1970-01-01
相关资源
最近更新 更多