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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top