Was ist der beste Weg, einen WCF-Service verfügbar zu machen, damit er einfach von Java / CXF genutzt werden kann?

8

Wir haben einen WCF-Dienst geschrieben, der von einem Java-Shop verwendet werden soll, der CXF zum Generieren der Adapter verwendet. Wir sind mit Java nicht so vertraut, haben den Dienst jedoch mithilfe von basicHttpBinding, SSL und Standardauthentifizierung verfügbar gemacht. Integrationstests zeigen, dass ein .NET-Client den Dienst problemlos nutzen kann. Der Java-Shop hat jedoch Schwierigkeiten, den Dienst zu nutzen. Insbesondere erhalten sie den folgenden JAXB-Fehler: Zwei Deklarationen verursachen eine Kollision in der ObjectFactory-Klasse. Dies wird normalerweise verursacht, wenn 2 Operationen denselben Namen und denselben Namespace haben, wenn CXF versucht, Adapterklassen zu erstellen.

Wir können keine Typ- oder Operationsnamen finden, die irgendeine Art von Kollision verursachen könnten. Wir haben sichergestellt, dass alle benutzerdefinierten Typen einen Namespace angeben, und tempuri.org wird nirgendwo in der WSDL angegeben. Der Java-Shop vermutet den Fehler, weil die generierte WSDL & lt; xsd: import elements enthält.

Also, meine Fragen:

  • Gibt es einen besseren Weg als CXF, damit der Java-Shop den WCF-Dienst nutzt? Project Tango sieht interessant aus, aber ich weiß nicht genug, um ihnen zu sagen, dass sie es in Betracht ziehen sollten. Ist CXF ein Defacto-Standard in Java?
  • BasicHttpBinding / SSL / Basic Auth werden MS für Interop-Szenarien empfohlen, aber der Client scheint weiterhin Interop-Probleme zu haben. Sollten wir andere Bindungen oder Einstellungen in Betracht ziehen, um diese einfacher zu konsumieren?
  • Gibt es eine Möglichkeit, WCF so zu konfigurieren, dass immer nur ein WDSL ohne Schemaimporte ausgegeben wird?
Daniel 23.02.2009, 19:24
quelle

6 Antworten

4

Die Fehlermeldung "Zwei Deklarationen verursachen eine Kollision in der Klasse ObjectFactory" hat normalerweise nichts mit Importen zu tun. Das ist eine JAXB-Fehlermeldung, die normalerweise dadurch verursacht wird, dass mehrere Elemente oder ähnliches vorhanden sind, die bewirken, dass die generierten Feldnamen identisch sind. Zum Beispiel, wenn Sie Elemente haben wie:

& lt; Elementname="Foo" ... / & gt; und & lt; Elementname="foo" ... / & gt;

Das kann diesen Fehler verursachen. Ein anderer verwendet Dinge wie Bindestriche und Unterstriche und solche, die normalerweise eliminiert werden + capped: & lt; Elementname="doFoo" ... / & gt; und & lt; Elementname="do_foo" ... / & gt;

Mit 2.1.4 können Sie versuchen, den Befehl wsdl2java mit dem Flag -autoNameResolution auszuführen. Das hilft manchmal, aber nicht immer. Unglücklicherweise sind die Informationen, die JAXB in diesen Fällen gibt, fast wertlos und es ist oft nur Versuch und Irrtum, die in Konflikt stehenden Typen zu finden. : - (

    
Daniel Kulp 23.02.2009, 20:48
quelle
1

Ich habe WCF mit Axis2-Clients entwickelt. Die Authentifizierungsmethoden, die ich erfolgreich verwendet habe, sind BasicHttpBinding / SSL / Basic (Transport) und WS-Security mit Benutzername (und MTOM).

Die Metro-Implementierung wird von SUN und Microsoft verwendet, um das Interop zu testen: Ссылка

Es gibt keine Hinweise auf den von WCF für die Schemadefinition generierten Import.

    
MatthieuGD 23.02.2009 20:40
quelle
1

Ich bin tief in Java & amp; WCF-Interoperabilität. Wie jemand anders sagte, müssen Sie Ihre WSDL reduzieren, wenn Sie mit dateibasierter WSDL arbeiten. Allerdings verwende ich Netbeans 6.5 und wenn Sie auf eine echte URL wie Ссылка zeigen, kann Netbeans leicht mit der Standard-WCDs, die von WCF generiert werden, umgehen. Im wirklichen Leben sind andere Dinge, die Sie beachten müssen, Service Versionierung, optionale Datenmember (geht nicht gut in Java, so schlage ich vor, alle Datenmember IsRequired = wahr zu machen), Reihenfolge etc ..

Das eigentliche Problem war die Sicherheit. Ich musste gegenseitige Zertifikatauthentifizierung arbeiten lassen und es hat noch einige Probleme.

    
kanad 24.02.2009 08:35
quelle
0

Die einzige Möglichkeit für Ihren Java-Client, mit einer WCF-Komponente zu kommunizieren, ist eine der HTTP-Methoden - basicHttpBinding, ws * usw., so wie es MS empfiehlt. Java kann nicht mit WCF über TCP oder NamedPipes oder MSMQ usw. kommunizieren.

Ich würde mit einer sehr einfachen WCF-Komponente beginnen - etwas mit einer einzigen Methode, die eine Zeichenfolge ausspuckt. Lass dich mit Java arbeiten und arbeite dich dann hoch. Stellen Sie sicher, dass alles, was Sie aussetzen, mit Basistypen oder gut definierten [DataContract] -Objekten arbeitet.

    
Tad Donaghe 23.02.2009 20:23
quelle
0

Das Problem mit xsd: import ist sehr verbreitet. Einige Toolkits oder Laufzeiten können damit nicht umgehen. Um dies zu beheben, können Sie die von WCF generierte WSDL reduzieren. Überprüfen Sie diesen Beitrag .

Ob CXF der richtige Java-Stack ist - habe ich noch nie davon gehört? Ich habe AXIS erfolgreich verwendet, ebenso wie JAX-WS. Beide waren ziemlich einfach.

    
Cheeso 24.02.2009 08:04
quelle
0

Dies ist ein Jaxb-Problem. Ich stieß auf das gleiche Problem, aber verwendet die Option xmlbeans stattdessen in der Client-Generation wsdl2java. Um ehrlich zu sein, scheine ich die xmlbeans Objekte mehr über jaxb als einen Verbraucher zu diesem Webservice vorzuziehen.

    
dev101 19.07.2010 16:21
quelle

Tags und Links