2017-02-28 163 views
0

我目前正在用Spring WS开发SOAP客户端。我跟着指南/教程,一切工作正常。除了一件事情,错误处理。Spring WS客户端处理HTTP错误

我无法控制我发送消息的SOAP端点。所以我想在事情出错的情况下做一些很好的异常处理。我在没有指望的测试场景中遇到了一些HTTP错误。我不知道如何处理它们。

例如:

我发送SOAP消息到错误的URL。其中返回HTTP 405方法不允许。 (我发送POST到仅GET的URL,这是一个配置错误,但仍然是一个错误)。 在正文中实际上是来自SOAP端点的HTML错误页面。当然,Spring不能处理这个消息并抛出一个异常。在堆栈跟踪中,它显然是405.但我想提取返回的错误代码并以其他方式记录(或者将它发回给发送SOAP消息请求的用户)。

这些是发送SOAP消息后,我收到一些日志消息(省略了其它记录):

org.apache.http.wire      : << "HTTP/1.1 405 Method Not Allowed[\r][\n]" 
o.a.h.impl.conn.DefaultClientConnection : Receiving response: HTTP/1.1 405 Method Not Allowed 
org.apache.http.headers     : << HTTP/1.1 405 Method Not Allowed 

是否有任何方式来捕捉和提取这些HTTP错误代码? 如果需要更多信息,请询问。我愿意提供尽可能多的信息,但我不知道此时还要发布什么内容。

编辑:或者有什么办法用集成测试来模拟/测试这个吗?我无法继续发送消息到真正的SOAP端点。我从集成测试中得不到与真实测试相同的输出(引导应用程序并将消息发送到真正的SOAP端点)。我已经将集成测试的日志记录级别设置为与真实测试环境相同。

谢谢!

回答

0

您可以通过扩展Sp​​ring WebServiceTemplate并重写handleError方法并添加自定义实现来创建自己的wsTemplate。

不知道是什么版本您使用,但一个共同的默认实现是这样的:

protected Object handleError(WebServiceConnection connection, WebServiceMessage request) throws IOException { 
    if (logger.isDebugEnabled()) { 
     logger.debug("Received error for request [" + request + "]"); 
    } 
    throw new WebServiceTransportException(connection.getErrorMessage()); 
} 

更有力,更希望的办法是写自己的org.springframework.ws.client.support.interceptor.ClientInterceptor,并通过setInterceptors在wsTemplate设置方法。不确定你能从MessageContext对象中得到什么足以满足你的需求,但是所有的soap故障都将以这种方式被拦截。

public class MyClientInterceptor implements ClientInterceptor { 

    public boolean handleFault(MessageContext messageContext){ 
     // custom implementation 
    } 

    public boolean handleRequest(MessageContext messageContext){ 
     return true; 
    } 

    public boolean handleResponse(MessageContext messageContext){ 
     return true; 
    } 
} 
+0

我试过这个实现,它似乎工作,但不是最佳。我尝试在此方法中实现'log.error(“Error message:”+ webServiceConnection.getErrorMessage());''。它在我的日志中记录以下错误:'错误消息:[405]'。我将不得不从getErrorMessage()返回的字符串中去掉响应代码。我实际上想要捕获HTTP头,它的HTTP响应代码由'org.apache.http.headers'记录,因为它看起来更健壮。任何方式来做到这一点? – Clemenz

+0

我编辑了我的答案,不知道您是否需要特定的状态代码,或仅仅通过检测soap故障就足以满足您的要求。 – artemisian

+0

问题是,soap端点没有返回SOAP错误。但实际的HTTP错误代码与HTML错误页面。这就是为什么我需要捕获HTTP返回代码,以检查它是否是4xx或5xx。因为我不打算解析HTML文件。我已经在试用ClientInterceptor。也许今天我会得到一个解决方案。感谢寿! – Clemenz