Mapa de primavera um arquivo para um URL / URI
-
24-09-2019 - |
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
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.