1

我想知道是否有人可以在这里指出我正确的方向。

我正在开发一个需要创建 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>

感谢任何人提前输入,不确定是否有人遇到过此类问题。

达米安

4

1 回答 1

0

您需要做的是禁用唯一粒子属性检查。通常,这在 Java 中有效(请参阅此SO 帖子),您只需要找到一种配置它的方法...最坏的情况可能是根据上面的链接构建您自己的验证器 - 它应该可以工作,因为 Spring 的 XSD 模式是使用 Apache 的实现。

于 2013-01-08T15:35:24.437 回答