Весенняя карта файла на URL / URI
-
24-09-2019 - |
Вопрос
У меня есть весной веб-сайт, для которого у меня есть схема в каталоге, как:
- Webroot / datacontract / person.xsd
- Webroot / datacontratt / sub-person.xsd
Где Sub-Person.xsd включен в Person.xsd то есть:
Лично .xsd:
<xsd:import namespace="http://www.mynamespace.org/xml/sub-person"
schemaLocation="sub-person.xsd"/>
Я определил WSDL как:
<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>
Я могу получить доступ к файлу WSDL с использованием:
http: // localhost: 8080 / myApp / ws / personnelservice / personev.wsdl
Однако при использовании этого WSDL клиент может получить Person.xsd и не может получить Sub-Person.xsd, давая ошибку не удалось загрузить
http: // localhost: 8080 / myApp / ws / personnelservice / sub-person.xsd
Мой вопрос в том, как я могу сделать Sub-Person.xsd в этом месте URI?
Я также изменил местоположение, указанное в Person.xsd как:
<xsd:import namespace="http://www.mynamespace.org/xml/sub-person"
schemaLocation="/DataContract/sub-person.xsd"/>
Что затем клиент пытался найти Sub-Person.xsd по адресу:
http: // localhost: 8080 / sub-person.xsd что не правильно.
Еще одна попытка была:
<xsd:import namespace="http://www.mynamespace.org/xml/sub-person"
schemaLocation="DataContract/sub-person.xsd"/>
Что затем клиент пытался найти Sub-Person.xsd по адресу:
http: // localhost: 8080 / myApp / ws / personnelservice / datacontratt / sub-person.xsd
Решение
Spring-WS имеет это Действительно хороший объект Для обработки этого, используя проект 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>
То inline
Свойство - это ключ - он читает в каждом файле схемы, и всякий раз, когда он находит import
или include
Ссылка от одного к другому, она заменяет ссылку с содержимым ссылочного файла.
Влияние этого состоит в том, что вывод контроллера WSDL-генерации является одним файлом со всей информацией схемы, включенной в нее, в то же время сохраняя различные файлы схемы, отделенные на сервере. Тогда вам не нужно беспокоиться о том, если клиент может преследовать ссылки и правильно разрешать, поскольку там являются Нет ссылок.