如何在JAX-RS应用程序(WebSphere Liberty)中更改Jackson版本



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

在WebSphere 8.0中,Jackson是由WebSphere提供的。我可以在AppServerplugins目录下找到jackson-core-asl-1.9.12.jar, jackson-jaxrs-1.9.12.jar, jackson-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版本?

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

A)您仍然需要明确指定JSON提供程序。

B)您可能会看到16.0.0.2的NPE,如下所述:Websphere自由配置文件中的注册器JacksonJsonProvider。我们已经按照描述解决了这个问题。最新的测试版没有显示此行为,这表明下一个运行时更新也不会。

示例: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

是的,WebSphere Liberty使用比传统WAS更旧的Jackson版本。我们得把它修好!

同时,另一种可能性是使用jaxrs-2.0特性,然后在应用程序或共享库中包含较新版本的Jackson。

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

希望这对你有帮助,Andy

Alexey,您是否尝试过对自由部署的应用程序使用parentLast加载器方法,以便应用程序类可以优先使用?你可以参考这个问题来获得更多的见解。这里也有IBM的相关文档

最新更新