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

Customize endpoint mapping in spring-ws

我正在使用 Spring WS 实现 SOAP Web 服务。

我的大部分实现都是使用带有@Endpoint 注释的类型和这些类型中带有@SoapAction 注释的方法完成的。一些端点拦截器也有助于将事物粘合在一起。

我正在使用 Spring SoapFaultAnnotationExceptionResolver 的异常处理,它通过一些特定的细节丰富了 SoapFault。

这个效果很好。但是我有一个客户要求说我还必须为那些使用无效 soap-action 调用服务的情况提供自定义的 SoapFaults。意思是,我没有匹配的 @SoapAction 注释的 soap 操作。

现在发生的是 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 服务器获得此 returned 以及 404 return 代码。

在这种情况下如何捕获这些异常并添加一些自定义的 soapfault 处理?似乎只有 org.springframework.ws.NoEndpointFoundException 有一个 @SoapFault 注释,我可以让它通过我的异常解析器并以这种方式自定义它。但不幸的是,它没有。

我想我可能必须实施一些自定义 "catch-all" 端点映射,但我不确定如何执行此操作,以及如何确保首先尝试映射到特定端点。

有人对如何执行此操作有建议吗?

异常似乎是从 class MessageDispatcher 方法调度中抛出的:

mappedEndpoint = getEndpoint(messageContext);
if (mappedEndpoint == null || mappedEndpoint.getEndpoint() == null) {
    throw new NoEndpointFoundException(messageContext.getRequest());

我建议扩展这个 class 而不是抛出异常,你可以这样添加一个 soap 错误:

SoapMessage response = (SoapMessage) messageContext.getResponse();
String faultString = "any message"
SoapBody body = response.getSoapBody();
SoapFault fault = body.addServerOrReceiverFault(faultString, getLocale());

您可以查看 SimpleSoapExceptionResolver 处理端点上的异常情况。