Java Spring将文件映射到Url/URI
我有一个SpringWebService,其架构位于以下目录中:Java Spring将文件映射到Url/URI,java,web-services,spring,spring-ws,Java,Web Services,Spring,Spring Ws,我有一个SpringWebService,其架构位于以下目录中: 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" schemaLocat
- WebRoot/DataContract/person.xsd
- WebRoot/DataContract/sub-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文件:
但是,当使用此wsdl时,客户端可以获取person.xsd,但无法获取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:
这是不对的
另一次尝试是:
<xsd:import namespace="http://www.mynamespace.org/xml/sub-person"
schemaLocation="DataContract/sub-person.xsd"/>
客户端随后尝试在以下位置查找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>
/DataContract/person.xsd
/DataContract/sub-person.xsd
inline
属性是键-它在每个架构文件中读取,并且每当它找到从一个到另一个的import
或include
引用时,它都会用引用文件的内容替换引用
这样做的效果是,WSDL生成控制器的输出是一个包含所有模式信息的单个文件,同时仍然保持服务器上各个模式文件的独立性。这样,您就不必担心客户端是否能够追踪引用并正确解析它们,因为没有引用。您可以使用
和来执行相对路径。试试看,我试过了,但没用:(我想知道是否有某种方式的Spring资源可以像Servlets一样定义。感谢它解决了这个问题。我在schemaCollection中遗漏了'inline'属性,我只是不确定拥有一个庞大的wsdl文件是否是一个好主意。@saky:内联模式文件可以对性能产生很大的影响有可能吗我不想生成WSDL,因为我已经有了它,但是模式是在单独的文件中外部定义的(而且有很多文件)。使用SimpleWsdl11Definition
不会获取模式。