我有一个spring webservice,我将目录中的模式设置为:
其中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
答案 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
属性是关键 - 它在每个模式文件中读取,每当它从一个到另一个找到import
或include
引用时,它就会用引用文件的内容。
这样做的结果是WSDL生成控制器的输出是一个单独的文件,其中内嵌了所有模式信息,同时仍然将各种模式文件保持在服务器上。然后,您不必担心客户端是否可以追踪引用并正确解决它们,因为 没有引用。