Spring asigna un archivo a una URL/URI
-
24-09-2019 - |
Pregunta
Tengo un servicio web de primavera para el cual tengo el esquema en un directorio como:
- WebRoot/DataContract/persona.xsd
- WebRoot/DataContract/sub-persona.xsd
Donde sub-person.xsd está incluido en person.xsd, es decir:
en Persona.xsd:
<xsd:import namespace="http://www.mynamespace.org/xml/sub-person"
schemaLocation="sub-person.xsd"/>
He definido el wsdl como:
<bean id="personserv" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition">
<property name="schemaCollection" ref="schemaCollection"/>
<property name="portTypeName" value="personserv"/>
<property name="locationUri" value="/ws/personnelService/"/>
<property name="targetNamespace" value="http://www.mynamespace.org/definitions"/>
</bean>
Puedo acceder al archivo wsdl usando:
http://localhost:8080/myapp/ws/personnelService/personserv.wsdl
Sin embargo, al utilizar este wsdl, el cliente puede recuperar person.xsd y no puede recuperar sub-person.xsd, lo que genera un error al cargar.
http://localhost:8080/myapp/ws/personnelService/sub-person.xsd
Mi pregunta es ¿cómo puedo hacer que sub-person.xsd esté disponible en esa ubicación de URI?
También cambié la ubicación especificada en person.xsd como:
<xsd:import namespace="http://www.mynamespace.org/xml/sub-person"
schemaLocation="/DataContract/sub-person.xsd"/>
que el cliente luego intentó encontrar sub-person.xsd en:
http://localhost:8080/sub-persona.xsd lo cual no es correcto.
Otro intento fue:
<xsd:import namespace="http://www.mynamespace.org/xml/sub-person"
schemaLocation="DataContract/sub-person.xsd"/>
que el cliente luego intentó encontrar sub-person.xsd en:
http://localhost:8080/myapp/ws/personnelService/DataContract/sub-person.xsd
Solución
Spring-WS tiene esto instalaciones realmente agradables para manejar esto, haciendo uso del proyecto Apache XML Commons:
<bean id="schemaCollection" class="org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection">
<property name="xsds">
<list>
<value>/DataContract/person.xsd</value>
<value>/DataContract/sub-person.xsd</value>
</list>
</property>
<property name="inline" value="true"/>
</bean>
El inline
La propiedad es la clave: lee cada archivo de esquema y cada vez que encuentra un import
o include
referencia de uno a otro, reemplaza la referencia con el contenido del archivo referenciado.
El efecto de esto es que la salida del controlador de generación WSDL es un único archivo con toda la información del esquema incorporada, manteniendo los distintos archivos de esquema separados en el servidor.Entonces no tienes que preocuparte de si el cliente puede perseguir las referencias y resolverlas adecuadamente, ya que hay son sin referencias.