我在XSD中定义了许多必需的soap标头,我不允许更改,因为现有客户端已经在生产中使用这些标头。
在其中一个模式中,有许多具有相同命名空间值的导入。当我尝试将此模式加载到我的验证拦截器时,我得到一个异常,说sdsd:SystemName(序列中的第二个元素)是未定义的。 如果我在IntelliJ Idea 13中打开XSD,我会获得sdsd:SystemName和元素列表其余部分的红色标记。只找到并加载了sdsd:SystemOwnerName。
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sdsd="http://www.sdsd.dk/dgws/2010/08" xmlns:sdsd201206="http://www.sdsd.dk/dgws/2012/06" targetNamespace="http://www.sdsd.dk/dgws/2012/06" elementFormDefault="qualified" attributeFormDefault="unqualified">
<import namespace="http://www.sdsd.dk/dgws/2010/08" schemaLocation="../../2010/08/SystemOwnerName.xsd" />
<import namespace="http://www.sdsd.dk/dgws/2010/08" schemaLocation="../../2010/08/SystemName.xsd" />
<import namespace="http://www.sdsd.dk/dgws/2010/08" schemaLocation="../../2010/08/SystemVersion.xsd" />
<import namespace="http://www.sdsd.dk/dgws/2010/08" schemaLocation="../../2010/08/OrgResponsibleName.xsd" />
<import namespace="http://www.sdsd.dk/dgws/2010/08" schemaLocation="../../2010/08/OrgUsingName.xsd" />
<import namespace="http://www.sdsd.dk/dgws/2010/08" schemaLocation="../../2010/08/OrgUsingID.xsd" />
<import namespace="http://www.sdsd.dk/dgws/2010/08" schemaLocation="../../2010/08/RequestedRole.xsd" />
<element name="WhitelistingHeader" type="sdsd201206:WhitelistingHeader">
<annotation>
<documentation xml:lang="en-GB">SDSD Whitelisting header.</documentation>
<documentation xml:lang="da-DK">SDSD Whitelisting header.</documentation>
</annotation>
</element>
<complexType name="WhitelistingHeader">
<sequence>
<element ref="sdsd:SystemOwnerName" minOccurs="1" maxOccurs="1" />
<element ref="sdsd:SystemName" minOccurs="1" maxOccurs="1" />
<element ref="sdsd:SystemVersion" minOccurs="1" maxOccurs="1" />
<element ref="sdsd:OrgResponsibleName" minOccurs="1" maxOccurs="1" />
<element ref="sdsd:OrgUsingName" minOccurs="1" maxOccurs="1" />
<element ref="sdsd:OrgUsingID" minOccurs="1" maxOccurs="1" />
<element ref="sdsd:RequestedRole" minOccurs="1" maxOccurs="1" />
</sequence>
</complexType>
`
我已经阅读了这个帖子One xml namespace equals one and only one schema file?并且可以确认,如果我创建一个新的&#39;主人&#39;包含在上面显示的模式中导入的模式的模式,然后将上面显示的模式中的导入更改为&#39; master&#39; schema我的Spring-ws验证拦截器工作正常。
但是,由于更改架构不是一个选项,我正在寻找其他选项。
我找到了Xerces文档,Validate XML with loading schemas at runtime, failure depending on schema order建议我可以设置功能&#34; http://apache.org/xml/features/validation/schema/handle-multiple-imports&#34;在XmlSchemaFactory上为true,以便在验证具有多个导入到同一名称空间的模式时使Xerces不会失败。但是我有自己的SoapHeaderValidatingInterceptor,它扩展了AbstractValidatingInterceptor,后者又使用Spring WS内部的XmlValidatorFactory来创建用于验证XSD的XmlValidator。
我将非常感谢有关如何启用句柄多次导入功能的任何提示。