我正在阅读以下教程:
我遇到了一个问题。我不知道这是预期的结果还是某种错误。
这是关于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>
答案 0 :(得分:0)
这是设计上的。顾名思义,PayloadValidatingInterceptor
验证消息有效负载。对于SOAP消息,Spring-WS将有效负载定义为soapenv:Body
元素的第一个子元素,即您的案例中的sch:GetAllPersonsRequest
。因此,验证器甚至不会看到sch:XXXYYYZZZ
元素。
如果你真的想要检测那种类型的无效请求,可以选择以下选项:
AbstractFaultCreatingValidatingInterceptor
的拦截器,但是它提取SOAP信封而不是有效负载。请注意,这不会捕获未提供架构的名称空间中的元素。要在这些情况下触发验证错误,您需要调整SOAP 1.1模式中的processContents
属性。