选项 A:性能方面不是最好的解决方案,也不是最优雅的解决方案,但是由于您需要列出所有错误 - 实现 ValidationEventHandler,在 JAX-WS 逻辑处理程序中处理模式验证并抛出 SOAP 错误,接缝到成为最合适的解决方案。
选项 B:如果使用逻辑处理程序不是有吸引力的解决方案,SOAP 有效负载可能会在 SIB 中处理:
@Resource
WebServiceContext wsContext;
@WebMethod
public void test(String test) throws ValidationException {
MessageContext messageContext = wsContext.getMessageContext();
DOMSource source = (DOMSource) messageContext.getRequest().getPayloadSource();
...//Unmarshling and validating SOAP payload. Same as described in option A
}
选项 C:在较低级别操作,并具有额外的好处,即 SOAP 消息将被解组一次:
@WebServiceProvider
@ServiceMode(value=Service.Mode.MESSAGE)
public class TestProvider implements Provider<SOAPMessage>
{
public SOAPMessage invoke(SOAPMessage request)
{
SOAPBody requestBody = request.getSOAPBody();
Document document = requestBody.extractContentAsDocument();
...//Unmarshling and validating SOAP payload. Same as described in option A
}
}
这里描述了验证和其他不相关的东西,并且有关于模式验证的很好的文档。