Pergunta

Eu tenho um serviço da Web da primavera para o qual tenho o esquema em um diretório como:

  • Webroot/datacontract/pessoa.xsd
  • Webroot/datacontract/sub-person.xsd

Onde sub-person.xsd está incluído em pessoa.xsd ou seja:

em pessoa.xsd:

<xsd:import     namespace="http://www.mynamespace.org/xml/sub-person" 
                schemaLocation="sub-person.xsd"/>

Eu defini o 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>

Eu posso acessar o arquivo WSDL usando:

http: // localhost: 8080/myApp/ws/PersonnelService/PersOnserv.wsdl

No entanto, ao fazer uso deste WSDL, o cliente pode buscar a pessoa.xsd e não pode buscar sub-person.xsd, dando um erro falhou ao carregar

http: // localhost: 8080/myApp/ws/PersonnelService/sub-person.xsd

Minha pergunta é como posso disponibilizar sub-person.xsd no local da URI?

Também mudei o local especificado pessoalmente.xsd como:

<xsd:import     namespace="http://www.mynamespace.org/xml/sub-person" 
                schemaLocation="/DataContract/sub-person.xsd"/>

que o cliente então tentou encontrar sub-person.xsd em:

http: // localhost: 8080/sub-person.xsd o que não está correto.

Outra tentativa foi:

<xsd:import     namespace="http://www.mynamespace.org/xml/sub-person" 
                schemaLocation="DataContract/sub-person.xsd"/>

que o cliente então tentou encontrar sub-person.xsd em:

http: // localhost: 8080/myApp/ws/PersonnelService/datacontract/sub-person.xsd

Foi útil?

Solução

Spring-WS tem isso instalação muito boa Para lidar com isso, utilizando o projeto 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>

o inline Propriedade é a chave - ela lê em cada arquivo de esquema e sempre que encontrar um import ou include Referência de um ao outro, ele substitui a referência pelo conteúdo do arquivo referenciado.

O efeito disso é que a saída do controlador de geração WSDL é um único arquivo com todas as informações de esquema inlinhadas nele, enquanto ainda mantém os vários arquivos de esquema separados no servidor. Você não precisa se preocupar se o cliente pode perseguir as referências e resolvê -las corretamente, pois aí são Sem referências.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top