JAX-WS = Wenn Apache CXF installiert ist, "stiehlt" es die Standard-JDK-JAX-WS-Implementierung, wie wird es gelöst?
Habe ich ein komisches problem.
- Mit wsimport generiert ich als JAX-WS-Code aus einer WSDL-Datei (in einem eigenen eclipse-java-Projekt). Dies funktioniert gut in JDK6 ohne externe Abhängigkeiten (in Eclipse)
- Ich ein zweites Projekt, wo ich einmal verwendet Apache CXF. Wenn ich kopieren Sie den Code beschrieben, die in 1.) in diesem Projekt plötzlich nicht das JDK führt die JAX-WS-Sachen (Dateien, die ich erzeugt), sondern Apache CXF.
Wie kann ich verhindern, Apache CXF "laufen" auf der JAX-WS-Sachen. (Problem ist, CXF Ausfällt, um den code auszuführen...). Ich auch völlig verstehe nicht, wie Apache CXF entdeckt diese Klassen. Ich habe nicht registrieren, Sie anywere?
Vielen Dank!
Markus
Kommentar zu dem Problem
Ehrlich gesagt, ich würde mich am meisten interessiert, warum CXF ausfällt, um den code auszuführen. CXF ist völlig JAX-WS kompatibel, so sollte es ein drop-in-Ersatz für den in-jdk-jax-ws-Implementierung. Bug-report?
InformationsquelleAutor der Frage Markus | 2011-06-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Apache CXF (
cxf-rt-frontend-jaxws-*.jar
um genau zu sein) registriert sich selbst als ein JAX-WS-provider in der JVM. Innerhalb der vorgenannten JAR-dort ist eine Datei namens:/META-INF/services/javax.xml.ws.spi.Provider
mit folgendem Inhalt:Wenn Sie nun einen Blick auf
javax.xml.ws.spi.FactoryFinder#find
Methode werden Sie entdecken, dass JDK sucht den KLASSENPFAD für die Anwesenheit vonjavax.xml.ws.spi.Provider
Datei und fällt zurück auf Standard-Sun-Implementierung, wenn nicht verfügbar. So haben Sie zwei Optionen, um Kraft fallback:entweder entfernen
cxf-rt-frontend-jaxws-*.jar
aus CLASSPATHoder überschreiben
javax.xml.ws.spi.Provider
- Datei zur Verfügung gestellt von CXF-zu-Punkt fallback LageDie zweite option ist eigentlich ein bisschen leichter. Erstellen Sie einfach:
Datei (vorausgesetzt, Sie verwenden Maven) mit folgendem Inhalt:
Das ist es, getestet mit
javax.xml.ws.Endpoint#publish
.InformationsquelleAutor der Antwort Tomasz Nurkiewicz
Für die default-Implementierung:
innen /src/main/resources/META-INF/services/javax.xml.ws.spi.Anbieter
InformationsquelleAutor der Antwort Ken Larson
Ich habe versucht, die anderen und ich konnte einfach nicht damit es funktioniert, so zu setzen, CXF, wenn es nicht gesetzt wurde, CXF, ich habe gerade überschreiben Sie die Stellvertretung innerhalb des Dienstes.
InformationsquelleAutor der Antwort EpicPandaForce
Die standard-Suche nach Mechanismen scheinen nicht zu funktionieren gut in einen OSGi-Container (*).
Gibt es zwei Möglichkeiten, die ich bekommen habe, zu arbeiten zwingen, den Dienst zu Holen, die die CXF Implementierung von
javax.xml.ws.spi.Provider
:den Ansatz der Einstellung
delegate
durch Reflexion in EpicPandaForce Antwort auf diese Frage (https://stackoverflow.com/a/31892305/109079)Berufung der unteren Ebene
JaxWsProxyFactoryBean
; scheint dies zu vermeiden, werden alle Anrufe zu derjavax.xml.ws.spi.FactoryFinder
im Lieferumfang von Java, die die Wurzel des ProblemsHier ist ein Beispiel für die letztere, für weniger unerschrockene Programmierer, die lieber nicht nachdenklich Wechsel private Felder:
Ein paar Anmerkungen:
Übergabe eines
URL
wie oben, anstatt den einfacherenfactory.setWsdlURL(String)
kann erforderlich sein, wenn die WSDL ist eine resource im classpath (vermeiden unauflöslicherbundle://...
URLs für die classpath-Elemente)Müssen Sie möglicherweise zusätzliche Pakete für Funktionen (wie Adressierung)
(*) Als dafür, warum die Suche nach Mechanismen funktionieren nicht in den meisten OSGi-Containern, schauen Sie sich dieses kleine bisschen böse in Oracle Java
FactoryFinder
:OSGi = Glassfish? Fischig, in der Tat!
InformationsquelleAutor der Antwort Partly Cloudy
Ich hatte ein ähnliches problem. In meinem Fall musste ich
org.apache.cxf.jaxws.spi.ProviderImpl
für JAX-WS-Sachen (erstellen von webservice-Endpunkte, etc.) undcom.sun.xml.internal.ws.spi.ProviderImpl
für die Veröffentlichung von Endpunkten aufcom.sun.net.httpserver.HttpsServer
.Habe ich es geschafft, dies zu lösen, durch meinen eigenen Anbieter, die sich
javax.xml.ws.spi.Provider
und verwenden Sie dieses anstelle des Standard ein.Dann erstellen Sie einfach:
Datei (vorausgesetzt, Sie verwenden Maven) mit folgendem Inhalt:
InformationsquelleAutor der Antwort Monika Bozhinova