我想知道是否有人可以在这里指出我正确的方向。
我正在开发一个需要创建 Web 服务功能以符合 SPML v2 规范 (https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=provision) 的项目。它是一个基于 XML 的供应服务规范。
我已经创建了映射到肥皂请求的名称空间和本地部分的端点。我的问题在于尝试使用规范本身提供的 XSD 验证 Spring Web 服务中的有效负载请求。根据我的研究,它是一个“开放内容模型”,任何验证或编译 XSD 的尝试都会导致唯一粒子属性错误。
发生这种情况是因为 CORE XSD 有一个“ExtensibleType”complexType,当其他 complexTypes 从它扩展时会导致错误。从我的研究中,我可以看到错误发生的原因,但我不想修改规范本身提供的 xsd。
例子:
<complexType name="ExtensibleType">
<sequence>
<any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</sequence>
<anyAttribute namespace="##other" processContents="lax"/>
</complexType>
<complexType name="SearchQueryType">
<complexContent>
<extension base="spml:ExtensibleType">
<sequence>
<annotation>
<documentation>Open content is one or more instances of QueryClauseType (including SelectionType) or LogicalOperator.</documentation>
</annotation>
<element name="basePsoID" type="spml:PSOIdentifierType" minOccurs="0" />
</sequence>
<attribute name="targetID" type="string" use="optional"/>
<attribute name="scope" type="spmlsearch:ScopeType" use="optional"/>
</extension>
</complexContent>
</complexType>
这将在尝试验证 xsds 时导致以下错误:
cos-nonambig: WC[##other:"urn:oasis:names:tc:SPML:2:0"] 和 "urn:oasis:names:tc:SPML: 2:0:search":basePsoID(或来自他们的替换组)违反“唯一粒子属性”。在针对此模式进行验证期间,将为这两个粒子创建歧义。
由于 XSD 本身是无效的,所以我有一段时间想弄清楚如何根据规范本身提供的 XSDS 实际验证有效负载请求。
当服务器尝试启动时,在 spring 上下文文件中添加 PayloadValidatingInterceptor 会导致相同的错误:
<bean id="validatingInterceptor"
class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor">
<property name="schemas">
<list>
<value>/WEB-INF/xsd/spml/pstc_spmlv2_core.xsd</value>
<value>/WEB-INF/xsd/spml/pstc_spmlv2_search.xsd</value>
</list>
</property>
<property name="validateRequest" value="true"/>
<property name="validateResponse" value="false"/>
</bean>
感谢任何人提前输入,不确定是否有人遇到过此类问题。
达米安