来自Spring-WS的PayloadValidatingInterceptor允许未包含在XSD中的elemens

时间:2014-07-03 16:19:57

标签: spring-ws xsd-validation

我正在阅读以下教程:

http://jeromebulanadi.wordpress.com/2010/02/25/basic-spring-web-service-tutorial-from-contract-to-security/

我遇到了一个问题。我不知道这是预期的结果还是某种错误。

这是关于PayloadValidatingInterceptor的行为。它可以很好地验证XSD中描述的所有元素,但它也允许在XSD中未定义的元素位于有效负载中。

例如,< sch:XXXYYYZZZ />在XSD中没有提到,并且以下请求返回错误(并且完全可以预期):

<soapenv:Envelope
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:sch="http://springwebapp.example.com/webservices/person/schema">

   <soapenv:Header/>
   <soapenv:Body>
      <sch:GetAllPersonsRequest>
        <sch:XXXYYYZZZ/>
      </sch:GetAllPersonsRequest>
   </soapenv:Body>
</soapenv:Envelope>

我收到以下回复(正如预期的那样):

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode>SOAP-ENV:Client</faultcode>
         <faultstring xml:lang="en">Validation error</faultstring>
         <detail>
            <spring-ws:ValidationError xmlns:spring-ws="http://springframework.org/spring-ws">cvc-complex-type.2.1: Element 'sch:GetAllPersonsRequest' must have no character or element information item [children], because the type's content type is empty.</spring-ws:ValidationError>
         </detail>
      </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

但我不知道为什么架构中未定义的元素允许在BODY元素中。以下内容不会返回错误并得到肯定的验证:

<soapenv:Envelope
  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:sch="http://springwebapp.example.com/webservices/person/schema">
   <soapenv:Header/>
   <soapenv:Body>
      <sch:GetAllPersonsRequest/>
      <sch:XXXYYYZZZ/>
   </soapenv:Body>
</soapenv:Envelope>

以下是ws-context.xml的摘录,其中定义了验证器:

<bean id="validatingInterceptor" class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor">
    <property name="xsdSchema" ref="schema" />
    <property name="validateRequest" value="true" />
    <property name="validateResponse" value="true" />
</bean>

1 个答案:

答案 0 :(得分:0)

这是设计上的。顾名思义,PayloadValidatingInterceptor验证消息有效负载。对于SOAP消息,Spring-WS将有效负载定义为soapenv:Body元素的第一个子元素,即您的案例中的sch:GetAllPersonsRequest。因此,验证器甚至不会看到sch:XXXYYYZZZ元素。

如果你真的想要检测那种类型的无效请求,可以选择以下选项:

  • 实现自己的扩展AbstractFaultCreatingValidatingInterceptor的拦截器,但是它提取SOAP信封而不是有效负载。
  • SOAP 1.1 schema导入项目,并将其与您自己的架构一起添加到自定义拦截器的配置中。

请注意,这不会捕获未提供架构的名称空间中的元素。要在这些情况下触发验证错误,您需要调整SOAP 1.1模式中的processContents属性。