2012-10-23 6 views
6

Ich habe versucht, Stubs und Client von einem WSDL-Datei zu erzeugen cxf mit (Versionen 2.2.3, 2.2.6 und 2.7.0), indem Sie den folgenden Befehl gebenFehler beim Client von WSDL-Datei zu erzeugen Apache CXF mit

> wsdl2java.bat -p com.easynet.eordering.client -client http://expediter.staging.gis.easynet.com:7001/cds/services/eordering?wsdl 

aber ich erhalte eine Fehlermeldung als

WSDLToJava Error: Non unique body parts! In a port, operations must have unique operation signaure on the wire for successful dispatch. In port {http://eordering.uk.easynet.net}eorderingPortSOAP, Operations "{http://eordering.uk.easynet.net}getAMList" and "{http://eordering.uk.easynet.net}getDCList" have the same request body block {http://eordering.uk.easynet.net}userListRequest

ich weiß, warum dieser Fehler ausgelöst wurde, als

in meinen wsdl Operationen geschrieben
<operation name="getDCList"><input message="tns:userListRequest"/><output message="tns:userListResponse"/></operation> 
<operation name="getAMList"><input message="tns:userListRequest"/><output message="tns:userListResponse"/></operation> 

Ich habe gerade den Parameter userListRequest für beide Operationen wiederverwendet. Ich glaube, der Fehler wurde ausgelöst, da in beiden Operationen derselbe Parameter (userListRequest) angegeben wurde.

Gibt es eine Möglichkeit, diesen Fehler zu vermeiden, ohne Änderungen an der WSDL? (wie ich weiß, Operation Überladung ist nicht erlaubt von WSDL 1.2 aber Eingangsparameter überladen?).

Antwort

11

Eine solche WSDL wäre nicht WSI-BasicProfile-kompatibel. Siehe:

http://www.ws-i.org/profiles/basicprofile-1.1.html#Operation_Signatures

Das Profil definiert die Operation Signatur als Name des Elements, das in der Seife erscheinen würde: Body. Wenn also zwei Operationen das gleiche Kind-Element (oder eine Nachricht in Ihrem Fall) verwenden, werden sie nicht eindeutige und verletzt betrachtet:

R2710 The operations in a wsdl:binding in a DESCRIPTION MUST result in operation signatures that are different from one another. 
+0

Danke für den Link zu erzeugen, zur Verfügung gestellt, dachte ich so, aber hier, um den Fehler zu vermeiden, ohne die Wsdl params Wechsel :-), wird die Unterschriften nun ändern. – Techie

6

Wie in der Frage erwähnt:

Is there any way to avoid this error without making changes to the wsdl ?

Wenn Sie können ‚t die WSDL beheben, können Sie die Validierung deaktivieren:

-validate = none

oder wenn Sie Maven verwenden:

<configuration> 
    <wsdlOptions> 
     <wsdlOption> 
      <wsdl>${basedir}/src/main/wsdl/my.wsdl</wsdl> 
      <validate>none</validate> 
     </wsdlOption> 
    </wsdlOptions> 
</configuration> 

Nicht sicher, ob dies zur Laufzeit keine Probleme verursacht. Ich werde das bald finden und werde diesen Beitrag aktualisieren.

+1

-1 für eine destruktive Antwort ... – MGorgon

+2

Wenn Sie keine Kontrolle über die WSDL haben, dann hätten Sie nicht die Möglichkeit, es zu beheben. Mein Projekt befindet sich bereits seit einigen Monaten in der Entwicklung und bisher sind mir keine Nachteile aufgefallen. –

+0

entfernt -1 für gegebene Erklärung – MGorgon

0

Wenn WSDL Änderung möglich ist und WS-I Basic Profile 2.0 verwendet wird, können Sie wsa:Action mit unique value zu Element wsdl:input (innen Element wsdl:operation) hinzufügen:

Z.B.

<wsdl:operation name="update"> 
    <wsdl:input message="tns:myMessage" wsam:Action="namespace/port/operation" /> 
</wsdl:operation> 

Im WS-I Basic 2.0 die Definition von „Operation Signatur“ Profil: Betrieb Signatur ‚„Das Profil der definiert‘der vollständige Name des Kindes Element der SOAP-Body der SOAP-Eingangsnachricht zu sein beschrieben durch eine Operation in einer WSDL-Bindung und den URI-Wert des Headers wsa: Action SOAP, falls vorhanden. "

0

Eine andere Arbeit ist versuchen, die Schemadatei von der WSDL zu erhalten. und die folgende Plugin in Maven der Java-Klasse

<plugin> 
<groupId>org.jvnet.jax-ws-commons</groupId> 
<artifactId>jaxws-maven-plugin</artifactId> 
<version>2.3</version> 
<executions> 
<execution> 
<id>schema1-generate</id> 
<goals><goal>wsimport</goal></goals> 
<configuration> 
<extension>true</extension> 
<bindingFiles> 
<bindingFile>${basedir}/src/main/resources/wsdl/service-bindings.xjc 
</bindingFile> 
</bindingFiles> 
<wsdlDirectory>src/main/resources/wsdl</wsdlDirectory> 
<wsdlFiles> 
<wsdlFile>Service.wsdl</wsdlFile> 
</wsdlFiles> 
<keep>true</keep> 
<sourceDestDir>target/generated-code/src</sourceDestDir> 
<vmArgs> 
<vmArg>-Djavax.xml.accessExternalSchema=all</vmArg> 
</vmArgs> 
</configuration> 
<phase>generate-sources</phase> 
</execution> 
</executions> 
</plugin> 
Verwandte Themen