Java Spring将文件映射到Url/URI

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

我有一个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" 
                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
不会获取模式。