Вопрос

У меня есть весной веб-сайт, для которого у меня есть схема в каталоге, как:

  • 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-генерации является одним файлом со всей информацией схемы, включенной в нее, в то же время сохраняя различные файлы схемы, отделенные на сервере. Тогда вам не нужно беспокоиться о том, если клиент может преследовать ссылки и правильно разрешать, поскольку там являются Нет ссылок.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top