如何在WebService出站网关请求回调前后记录请求消息
解决方案:在WebService调用前后打印请求消息
嘿,我来帮你搞定Spring Integration里WebService调用前后的消息日志打印需求!结合你现有的配置和已经实现的WSAHeaderCallback,有几个简单直接的方案可以落地:
1. 扩展现有WSAHeaderCallback打印调用前请求消息
你已经实现了RequestCallback的doWithMessage方法,直接在这里加日志逻辑就能打印调用前的SOAP请求内容,不用额外改配置。
示例代码如下:
import org.springframework.ws.WebServiceMessage; import org.springframework.ws.client.core.RequestCallback; import org.springframework.ws.soap.saaj.SaajSoapMessage; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.StringWriter; public class WSAHeaderCallback implements RequestCallback { @Override public void doWithMessage(WebServiceMessage message) { // 保留你原有的Header处理逻辑 // ... // 添加请求消息打印逻辑 if (message instanceof SaajSoapMessage) { try { SaajSoapMessage saajMessage = (SaajSoapMessage) message; StringWriter writer = new StringWriter(); Transformer transformer = TransformerFactory.newInstance().newTransformer(); // 开启XML格式化,让日志更易读 transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); transformer.transform(new DOMSource(saajMessage.getSaajMessage().getSOAPPart()), new StreamResult(writer)); System.out.println("=== WebService 调用前请求消息 ==="); System.out.println(writer.toString()); } catch (Exception e) { e.printStackTrace(); } } } }
2. 用Spring Integration日志适配器打印调用后响应消息
你已经定义了logging-channel-adapter,只需把它接入到调用后的消息流里就行,有两种灵活的方式:
方式A:直接修改现有Chain,插入日志节点
在ws:outbound-gateway之后添加日志适配器,就能直接打印回调后的响应消息:
<int:chain input-channel="tmsoapInChannel" output-channel="dest-channel"> <ws:header-enricher> <ws:soap-action value="http://bnst.l/tm/TWebService/vrrrectieRequest"/> </ws:header-enricher> <ws:outbound-gateway uri="http://bnst.l/tm/TWebService" request-callback="WSAHeaderCallback"/> <!-- 新增:打印调用后的响应消息 --> <int:logging-channel-adapter log-full-message="true" level="INFO"/> </int:chain> <int:logging-channel-adapter id="loggit" log-full-message="true" channel="justLog" />
方式B:用Wire-Tap监听通道(不改动原有Chain结构)
如果不想修改现有Chain的逻辑,可以用wire-tap悄悄监听消息通道,把请求/响应消息转发到你的justLog通道:
<!-- 监听调用前的请求消息 --> <int:channel id="tmsoapInChannel"> <int:wire-tap channel="justLog"/> </int:channel> <!-- 监听调用后的响应消息 --> <int:channel id="dest-channel"> <int:wire-tap channel="justLog"/> </int:channel> <int:logging-channel-adapter id="loggit" log-full-message="true" channel="justLog" level="INFO"/>
3. 小提示
- 确保日志级别配置正确(比如
INFO或DEBUG),不然可能看不到完整的消息内容。 - 如果日志里的XML显示混乱,记得加上代码里的XML格式化配置,让输出更规整。
内容的提问来源于stack exchange,提问作者Kris Swat
相关产品推荐
相关产品推荐

