Spring将文件映射到Url / URI

时间:2010-03-04 11:26:21

标签: java web-services spring spring-ws

我有一个spring webservice,我将目录中的模式设置为:

  • 的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

我的问题是如何在该URI位置提供sub-person.xsd?

我还将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 个答案:

答案 0 :(得分:1)

Spring-WS使用这个really nice facility来处理这个问题,利用了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属性是关键 - 它在每个模式文件中读取,每当它从一个到另一个找到importinclude引用时,它就会用引用文件的内容。

这样做的结果是WSDL生成控制器的输出是一个单独的文件,其中内嵌了所有模式信息,同时仍然将各种模式文件保持在服务器上。然后,您不必担心客户端是否可以追踪引用并正确解决它们,因为 没有引用。