2

我有一个spring webservice,我在一个目录中有架构:

  • WebRoot/DataContract/person.xsd
  • WebRoot/DataContract/sub-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

4

1 回答 1

1

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属性是关键 - 它读取每个模式文件,并且每当它找到一个importinclude从一个到另一个的引用时,它都会将引用替换为引用文件的内容。

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

于 2010-03-04T13:36:51.710 回答