Kann JAX-RS-Dienst CXF3.x nicht in Weblogic 12c implementieren (12.2.1)

8

Nach dem Upgrade eines JAX-RS-Dienstes, der mit CXF3.x von weblogic 12.1.3 auf 12.2.1 erstellt wurde, stehe ich vor folgendem seltsamen Problem:

%Vor%

Beachten Sie, dass ich CXF, nicht Jersey, verwende, aber Weblogic versucht, es zu benutzen (es passiert nicht mit 12.1.3). Ich habe es in Konfigurationsdateien nach diesen Empfehlungen deaktiviert: Ссылка

  

Bei der Standardkonfiguration möchte Weblogic seine interne Implementierung (JAX-RS 2.0 und Serialisierung) verwenden, um die REST-Webdienste (Error 500) zu implementieren:

META-INF / weblogic-application.xml

%Vor%

WEB-INF / weblogic.xml

%Vor%

Ich weiß nicht, ob das ein spezifisches Problem meines Projekts ist oder ob es sich um ein Weblogic-Problem handelt. Ich habe ähnliche Probleme wie dies und dies , und ich habe versucht, sie zu verwenden.

Dies sind meine Abhängigkeiten (IVY-Syntax)

%Vor%

Und der vollständige Stack-Trace

%Vor%

Abhilfe

Dies funktioniert, wenn ich zuvor ein anderes CXF-Modul mit der standardmäßigen JAX-RS-Implementierung bereitgestellt und WEB-INF/lib/javax.ws.rs-api-2.0.1.jar entfernt habe. Vielleicht führt Weblogic eine Art interne Initialisierung durch.

%Vor%     
pedrofb 03.08.2017, 13:40
quelle

1 Antwort

1

@pedrofb, dies beantwortet vielleicht Ihre Frage nicht vollständig, aber ich hatte einmal ein ähnliches Problem mit Tomcat. Die Symptome sind ähnlich, das Problem lag nicht wirklich an der Anwesenheit verschiedener Klassen in verschiedenen Gläsern, d.h. Es war aufgrund der Klassenlader Shadowing. In Tomcat ist Classloading tatsächlich invertiert, nicht das übliche "ask-your-parent-classloader-first" -Modell, wenn ein Anwendungs-Klassenlader eine Klasse finden kann (wo er nur aus WEB-INF / lib oder Klassen lädt), dann Classloader lädt die Klasse. Nun, in Ihrem Fall denke ich, da die JAX-RS-Jars in Ihrem WEB-INF / lib vorhanden sind, wird es von dort auf Web-Anwendungsebene geladen. Wenn dasselbe Objekt jedoch an den Container übergeben wird, versucht es, es in dieselbe Klasse zu konvertieren, jedoch auf Containerebene, die von einem anderen Classloader geladen wird. Klassen, die von verschiedenen Klassenladeprogrammen geladen werden, werden als unterschiedlich betrachtet. Dies wäre der Grund für die ClassCastException.

Dies würde auch erklären, warum es keine ClassCastException gibt, wenn Sie das JAX-RS-Jar von WEB-INF / lib entfernen. Die Problemumgehung hier ist begrenzt, entweder Sie entfernen das JAX-RS-Jar von Ihrem WEB-INF / lib wie Sie getan haben. (Dies könnte möglicherweise problematisch sein, aber Sie könnten in nicht produktiven Server experimentieren), ersetzen Sie den Behälter JAX-RS Behälter mit dem, den Sie wollen.

Wie ich bereits sagte, wird dies Ihr Problem wahrscheinlich nicht vollständig lösen, sondern in eine Richtung zeigen, woher das Problem kommt. [Wie ich vor einigen Jahren bemerkt habe, benutzt Weblogic Tomcat als seinen Webcontainerkern (nicht sicher, ob es immer noch derselbe ist) mit geänderten Paketnamen wie com.bea.weblogic.org.apache.tomcat ...].

>

Hoffe, das hilft.

    
Ironluca 08.09.2017 07:25
quelle