java - servicio - wsimport ejemplo
JAX-WS tiene esquema XSD en diferentes URL (2)
Hice un pequeño servicio web usando JAX-WS. El archivo WSDL tiene un elemento TYPES como este.
<types>
<xsd:schema>
<xsd:import namespace="http://ws.poc.mawia/" schemaLocation="http://localhost:777/ws/hello?xsd=1"/>
</xsd:schema>
</types>
La URL para el servicio web es http://localhost:777/ws/hello?wsdl
y XSD es http://localhost:777/ws/hello?xsd=1
. El archivo de esquema XSD en una ubicación diferente tiene las definiciones de tipos de datos como esta.
...
...
<xs:complexType name="student">
<xs:sequence>
<xs:element name="name" type="xs:string" minOccurs="0"/>
<xs:element name="rollNo" type="xs:int"/>
</xs:sequence>
</xs:complexType>
...
...
La mayoría de los archivos WSDL que he visto generalmente tienen las definiciones completas de XSD dentro del archivo WSDL, pero JAX-WS lo ubica en una ubicación diferente.
¿Es así como debería ser? ¿Cómo puedo configurar JAX-WS para colocar todas las definiciones XSD en un archivo WSDL?
¿Es así como debería ser?
Separar el XSD del WSDL es el comportamiento predeterminado en JAX-WS, y no debería preocuparse demasiado por él. Los marcos de WS actualizados (incluido WCF) generalmente pueden manejar eso. Dependiendo del tamaño del XSD, importarlo puede hacer que el WSDL sea más legible para un ser humano. Para un servicio web pequeño, sin duda sería más fácil tener un esquema incrustado, pero tampoco es un problema importarlo.
¿Cómo puedo configurar JAX-WS para colocar todas las definiciones XSD en un archivo WSDL?
No sé de una forma directa de hacer que el tiempo de ejecución incruste el esquema en el WSDL, pero hay una solución a través de la cual puede lograr esto:
- Publique su punto final y guarde el WSDL y el XSD
- Copie manualmente el contenido del XSD en la sección de
types
del WSDL y reemplace el esquema importado allí - Guarde el archivo WSDL fusionado en algún lugar donde su aplicación pueda acceder a él como un recurso
- Haga que su servicio web cargue el WSDL fusionado. Esto detendrá la generación dinámica, sin embargo, tendrá que actualizar manualmente el WSDL cada vez que realice cambios en la interfaz.
Puede implementar 4. personalizando la anotación @WebService
. Esto podría parecerse a esto:
@WebService( wsdlLocation = "MyWebService.wsdl")
public class MyWebService { .... }
No hay nada malo con su enfoque. WSDL apuntando a otro wsdl usando URL está bien.
Si no lo desea, mencione la ubicación wsdl utilizando el atributo wsdlLocation de la anotación @WebService. Pero de nuevo con este enfoque, tendrá que modificar wsdl manualmente.