我正在使用Spring WS实现SOAP Web服务。
我的大多数实现是使用带有@Endpoint注释的类型和带有@SoapAction注释的这些类型的方法完成的。一些端点拦截器也有助于将事物粘合在一起。
我正在使用SoapFaultAnnotationExceptionResolver的Spring异常处理,它通过一些特定的细节丰富了SoapFault。
这非常有效。但我有一个客户要求说我还必须为那些使用无效的soap-action调用服务的情况提供定制的SoapFaults。意思是肥皂动作,我没有匹配@SoapAction注释。
现在发生的事情是Spring记录了这个:
[WARN] org.springframework.ws.server.EndpointNotFound No endpoint mapping found for [AxiomSoapMessage {http://www.example.com/myservice/xml.schema/2010/06/01}MyRequest]
我从托管此Web服务的Jetty服务器返回404返回代码。
如何在这种情况下捕获这些异常并添加一些自定义soapfault处理?似乎只有org.springframework.ws.NoEndpointFoundException有一个@SoapFault注释,我可以让它通过我的异常解析器并以这种方式自定义它。但不幸的是,它没有。
我想我可能必须实现一些自定义的“全能”端点映射,但我不知道如何做到这一点,以及如何确保首先尝试映射到特定端点。
有人建议如何做到这一点吗?
答案 0 :(得分:0)
异常似乎是从方法dispatch中的类MessageDispatcher抛出的:
mappedEndpoint = getEndpoint(messageContext);
if (mappedEndpoint == null || mappedEndpoint.getEndpoint() == null) {
throw new NoEndpointFoundException(messageContext.getRequest());
我建议扩展这个类而不是抛出异常,你可以添加一个肥皂错误:
SoapMessage response = (SoapMessage) messageContext.getResponse();
String faultString = "any message"
SoapBody body = response.getSoapBody();
SoapFault fault = body.addServerOrReceiverFault(faultString, getLocale());
您可以查看处理端点上的例外的SimpleSoapExceptionResolver。