You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:18:16