Problema generando Java client SOAP servizi web con JDK strumento wsimport da un WSDL generato da un'applicazione .NET 2.0
-
16-09-2019 - |
Domanda
Sto cercando di generare un cliente per alcuni servizi SOAP web utilizzando lo strumento wsimport
JDK 6.
Il WSDL è stato generato da un'applicazione .NET 2.0. Per le applicazioni .NET 3.X, funziona benissimo.
Quando eseguo
wsimport -keep -p mypackage http://myservice?wsdl
mostra diversi messaggi di errore in questo modo:
[ERRORE] Una classe / interfaccia con lo stesso nome "mypackage.SomeClass" è già in uso. Utilizzare una personalizzazione di classe per risolvere questo conflitto. linea ?? di http: // myservice WSDL
Quando ho generare il client ai servizi Web utilizzando Axis 1.4 (utilizzando l'Eclipse WebTools plug-in).
Qualcuno sa cosa posso fare per utilizzare lo strumento wsimport
? Io davvero non capisco quale sia la cosa "class personalizzazione" è.
Soluzione
Non so se questo è stato mai risolto, ma ho trascorso qualche tempo googling per una soluzione a questo stesso problema.
Ho trovato qui una correzione - https: // JAX- ws.dev.java.net/issues/show_bug.cgi?id=228
La soluzione è quella di eseguire wsimport con il -B-XautoNameResolution
(senza spazi)
Altri suggerimenti
Per chiunque la lettura di questo usando Maven, questo è il modo di inserirlo nel file .pom. Si notino le args nella sezione di configurazione. Questo non è molto facile da trovare nella documentazione. Molte grazie a Isaac Stephens per il suo aiuto con questo.
<!-- definition for ERPStandardWork service -->
<execution>
<id>ERPStandardWorkService</id>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<!-- this resolves naming conflicts within the wsdl - there are several copies of fault report objects which clash otherwise. -->
<args>
<arg>-B-XautoNameResolution</arg>
</args>
<wsdlDirectory>${basedir}/src/main/resources/META-INF/wsdl</wsdlDirectory>
<wsdlFiles>
<wsdlFile>ERPStandardWork.wsdl</wsdlFile>
</wsdlFiles>
<wsdlLocation>${basedir}/src/main/resources/META-INF/wsdl/ERPStandardWork.wsdl
</wsdlLocation>
<staleFile>${project.build.directory}/jaxws/ERPStandardWork/.staleFlag
</staleFile>
</configuration>
</execution>
La risposta accettata sopra dovrebbe risolvere il tuo problema, ma andrei risolvere la causa di fondo.
Il problema sta accadendo perché un'operazione nel file WSDL ha lo stesso nome di un xsd: complexType nel file XSD - come nell'esempio qui sotto. Tutti i tipi e le operazioni dovrebbero avere nomi univoci.
<xsd:complexType name="SearchDocuments">
<xsd:sequence>
<xsd:element name="document" type="ns0:SearchDocumentById" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<operation name="SearchDocuments">
<input wsam:Action="http://controller.xxx.xxx.com/DocumentWS/searchDocumentsRequest" message="tns:searchDocumentsRequest"/>
<output wsam:Action="http://controller.xxx.xxx.com/DocumentWS/searchDocumentsResponse" message="tns:searchDocumentsResponse"/>
</operation>
Quindi, controllare le operazioni e tipi. Assicurarsi che nessuno di loro ha lo stesso nome cioè senza i nomi duplicati.
Si sono forse generando tutte le classi dal file WSDL nella stessa confezione. Se questo è il caso, provare a specificare un pacchetto di destinazione diversa per ogni file WSDL con l'opzione -p di wsimport.