Spring Отобразить файл в URL / URI - PullRequest
2 голосов
/ 04 марта 2010

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

  • WebRoot / DataContract / person.xsd
  • WebRoot / DataContract / суб-person.xsd

Где sub-person.xsd включен в person.xsd, то есть:

в Person.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/personserv.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/DataContract/sub-person.xsd

1 Ответ

1 голос
/ 04 марта 2010

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

...