2016-09-08 2 views
2

Ich migriere eine JAX-RS-Anwendung von WebSphere 8.0 nach WebSphere Liberty 8.5.5.So ändern Sie die Jackson-Version in der JAX-RS-App (WebSphere Liberty)

In WebSphere 8.0 wurde Jackson von WebSphere bereitgestellt. Ich kann jackson-core-asl-1.9.12.jar, jackson-jaxrs-1.9.12.jar, jackson-mapper-asl-1.9.12.jar und jackson-xc-1.9.12.jar Dateien im Verzeichnis AppServer\plugins\ finden.

Im neuen Anwendungsserver (WebSphere Liberty) erhalte ich folgende Ausnahme: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "myPropertyName". Ich denke, dass diese Ausnahme passiert, weil die Annotation @JsonIgnoreProperties(ignoreUnknown = true) auf den serialisierten Klassen nicht funktioniert. Ich vermute, dass dies geschieht, weil WebSphere Liberty 8.5.5 eine ältere Version von Jackson bereitstellt.

Ich habe versucht, die Version von Jackson, die ich brauche, mit meiner Anwendung, zu implementieren, aber es hat nicht geholfen (ich habe immer noch Ausnahmen). Wie kann ich WebSphere Liberty dazu bringen, die von mir benötigte Version von Jackson zu verwenden?

Antwort

4

WebSphere Freiheit wird die Version von Jackson verwenden Sie mit JAX-RS 2.0, mit ein paar Einschränkungen angeben (die wir jagen).

A) Sie müssen JSON-Provider noch explizit angeben.

B) Möglicherweise sehen Sie einen NPE mit 16.0.0.2 wie hier beschrieben: Regiser JacksonJsonProvider in Websphere liberty profile. Wir haben das wie beschrieben bearbeitet. Die neueste Beta zeigt dieses Verhalten nicht, was auch auf das nächste Runtime-Update nicht schließen lässt.

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

und

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

Unsere gradle build in der Abhängigkeit jackson bringt: https://github.com/gameontext/gameon-mediator/blob/6b469d18965673af35129abf3ff987b61af54c88/mediator-app/build.gradle

Und unsere server.xml verwendet jaxrs-2.0, funktioniert aber nicht mag irgendeinen classloader magic: https://github.com/gameontext/gameon-mediator/blob/6b469d18965673af35129abf3ff987b61af54c88/mediator-wlpcfg/servers/gameon-mediator/server.xml

HTH

+0

Danke, alles funktioniert, nachdem ich JAX-RS JSON Provider explizit angegeben habe und 'objectMapper.configure (DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false)' darin gesetzt habe. Ich habe '@JsonIgnoreProperties (ignoreUnknown = true) 'Annotationen entfernt. Ich musste die Version der Bibliothek nicht ändern. – Alexey

+0

Ausgezeichnet! Sehr erfreut zu wissen, dass dies auch für Sie funktioniert. – ebullient

1

Alexey, haben Sie einen parentLast Loader-Ansatz für die auf liberty implementierte Anwendung ausprobiert, damit Anwendungsklassen Vorrang haben. Sie können auf diese question verweisen, um mehr Einblicke zu erhalten. Dazu gibt es auch eine Dokumentation von IBM here

+0

Vielen Dank! Ich werde mir diese Frage ansehen. – Alexey

+0

Im Wesentlichen in Ihrer Anwendung EAR Verpackung, müssen Sie erwähnen, dass Sie Eltern als letzte (um anzugeben, dass Ihre gepackten Bibliotheken berücksichtigt werden sollen und nicht die Standard-geladenen durch den Klassenlader) –

+0

Es funktioniert nicht für mich aus irgendeinem Grund. – Alexey

2

Ja, WebSphere Liberty verwendet eine ältere Version von Jackson als traditionelle WAS. Wir müssen das reparieren lassen!

In der Zwischenzeit, eine andere Möglichkeit für Sie wäre die Verwendung der Jaxrs-2.0-Funktion und dann die neuere Version von Jackson in Ihrer Anwendung oder gemeinsam genutzte Bibliothek.

Einer der Unterschiede zwischen den Funktionen jaxrs-1.1 und jaxrs-2.0 von Liberty ist, dass jaxrs-2.0 die Jackson-API-Pakete nicht aussetzt. Daher könnte der Classloader der Anwendung die Jackson-Klassen, die mit Liberty ausgeliefert werden, nicht laden. Das bedeutet, dass es die Klassen aus Ihrer Anwendung laden würde, ohne parentLast delegation oder andere Classloader-Tricks ausführen zu müssen.

hoffe, das hilft, Andy

+0

Ich verwende die jaxrs-2.0-Funktion in server.xml. Und es sieht so aus, als hätte ich Jackson 1.6.2 auf dem Classpath zur Laufzeit (zur Verfügung gestellt von Liberty!). – Alexey

+0

Ich fand eine andere Lösung für mein Problem, aber vielleicht, wenn ich zu Jackson 2.x wechselte, würde es das Problem lösen. – Alexey

Verwandte Themen