在spring-ws中自定义端点映射

时间:2017-04-11 08:19:07

标签: web-services soap spring-ws

我正在使用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注释,我可以让它通过我的异常解析器并以这种方式自定义它。但不幸的是,它没有。

我想我可能必须实现一些自定义的“全能”端点映射,但我不知道如何做到这一点,以及如何确保首先尝试映射到特定端点。

有人建议如何做到这一点吗?

1 个答案:

答案 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