2016-09-08 28 views
2

JAX-RSアプリケーションをWebSphere 8.0からWebSphere Liberty 8.5.5に移行しています。JAX-RSアプリケーション(WebSphere Liberty)でJacksonバージョンを変更する方法

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を提供しているためです。

自分のアプリケーションに必要なジャクソンのバージョンを にデプロイしようとしましたが、それでも役に立たなかった(私はまだ例外があります)。 WebSphere Libertyに、必要なジャクソン版を使用させるにはどうすればいいですか?

答えて

4

のWebSphere Libertyは、あなたが(私たちが追いかけている)いくつかの注意事項で、JAX-RS 2.0で指定ジャクソンのバージョンを使用します。

A)JSONプロバイダを明示的に指定する必要があります。

B)Regiser JacksonJsonProvider in Websphere liberty profileのように16.0.0.2のNPEが表示されることがあります。私たちは、説明したようにそれを回避しました。最新のベータ版ではこの動作が発生しないため、次回のランタイムアップデートには影響しません。

例: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のビルドがジャクソンの依存関係にもたらします: 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

+0

ありがとう、JAX-RS JSONプロバイダを明示的に指定し、 'objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES、false)'を指定した後はすべて動作します。 @JsonIgnoreProperties(ignoreUnknown = true)アノテーションを削除しました。私はライブラリのバージョンを変更する必要はありませんでした。 – Alexey

+0

優秀!このことを知って非常にうれしいあなたのためにも、動作します。 – ebullient

1

Alexey、アプリケーションクラスが優先されるように、libertyにデプロイされたアプリケーションへのparentLastローダーアプローチを試してみましたか?あなたはより多くの洞察を得るためにこれを参照することができますquestion。 IBMのドキュメントもあります。here

+0

ありがとうございました!私はその質問を見ていきます。 – Alexey

+0

基本的にアプリケーションのEARパッケージ化では、最後に親が必要であることを言及する必要があります(パッケージ化されたライブラリが考慮され、クラスローダによってロードされたデフォルトのライブラリではないことを示すため) –

+0

何らかの理由で私のために機能しません。 – Alexey

2

はい、WebSphere Libertyは従来のWASより古いバージョンのJacksonを使用しています。それを解決する必要があります!

一方で、jaxrs-2.0機能を使用して、アプリケーションまたは共有ライブラリに新しいバージョンのJacksonを追加することもできます。

Libertyのjaxrs-1.1とjaxrs-2.0の機能の違いの1つは、jaxrs-2.0がJackson APIパッケージを公開していないことです。したがって、アプリケーションのクラスローダーは、Libertyとともに出荷されるJacksonクラスをロードすることはできません。つまり、parentLastデリゲートやその他のクラスローダーのトリックを使わずに、アプリケーションからクラスをロードします。

・ホープ、このことができます、アンディ

+0

server.xmlでjaxrs-2.0機能を使用しています。そして、それは実行時にclasspathにJackson 1.6.2を持っているように見えます(Libertyから提供されました!)。 – Alexey

+0

問題を解決する別の方法が見つかりましたが、Jackson 2.xに切り替えた場合、問題が解決する可能性があります。 – Alexey

関連する問題