Problema generación de Java de SOAP cliente de servicios web con wsimport herramienta JDK desde un WSDL generado por una aplicación .NET 2.0
-
16-09-2019 - |
Pregunta
Estoy tratando de generar un cliente para algunos servicios web SOAP utilizando la herramienta wsimport
JDK 6.
El WSDL fue generada por una aplicación de .NET 2.0. Para aplicaciones .NET 3.x, que trabaja muy bien.
Cuando corro
wsimport -keep -p mypackage http://myservice?wsdl
que muestra varios mensajes de error como este:
[ERROR] Una clase / interfaz con el mismo nombre "mypackage.SomeClass" ya está en uso. Utilice una personalización de clase para resolver este conflicto. línea ?? de http: // myservice WSDL
Cuando genero del cliente de servicios web utilizando Axis 1.4 (utilizando el Eclipse WebTools plug-in).
¿Alguien sabe qué puedo hacer con el fin de utilizar la herramienta wsimport
? Realmente no entiendo qué es lo más "clase personalización" es.
Solución
No sé si esto era cada vez resuelto, pero pasé un tiempo buscando en Google para una solución a este mismo problema.
He encontrado una solución aquí - https: // jax- ws.dev.java.net/issues/show_bug.cgi?id=228
La solución es ejecutar wsimport con el -B-XautoNameResolution
(sin espacios)
Otros consejos
Para cualquier persona experta en la lectura de este usando, esta es la forma de agregarlo al archivo .pom. Tenga en cuenta los args en la sección de configuración. Esto no se encuentra fácilmente en la documentación. Muchas gracias a Isaac Stephens por su ayuda con esto.
<!-- 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 respuesta aceptada por encima resolvería su problema, pero wouldnt corregir la causa subyacente.
El problema ocurre porque una operación en su archivo WSDL tiene el mismo nombre que un xsd: complexType en su archivo xsd - como el ejemplo a continuación. Todos los tipos y las operaciones deben tener nombres únicos.
<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>
A fin de comprobar sus operaciones y tipos. Asegúrese de que ninguno de ellos tiene el mismo nombre, es decir no hay nombres duplicados.
Usted está posiblemente generando todas las clases desde el archivo WSDL en el mismo paquete. Si ese es el caso, intente especificar un paquete de destino diferente para cada archivo WSDL con la opción -p de wsimport.