Guidewire Insurance Suite中捕获SOAP通信日志的方法咨询
Guidewire应用间SOAP通信捕获方案
一、通过Guidewire日志配置开启JAX-WS原生日志
Guidewire基于JAX-WS(GlassFish实现),可以通过调整日志配置和启动参数直接记录SOAP消息:
- 修改日志配置文件:在
config/log4j2.xml(对应环境的日志配置文件)中添加以下日志器,将SOAP消息输出到指定文件:
<Logger name="com.sun.xml.ws.transport.http.client.HttpTransportPipe" level="DEBUG" additivity="false"> <AppenderRef ref="FileAppender"/> <!-- 替换为你的文件输出Appender名称 --> </Logger> <Logger name="com.sun.xml.ws.server.dispatch.HttpAdapter" level="DEBUG" additivity="false"> <AppenderRef ref="FileAppender"/> </Logger>
- 调整启动参数:在Guidewire启动脚本(
gwenv.bat或gwenv.sh)中注入JVM系统属性,确保启动时加载:
# Linux/macOS环境 export JAVA_OPTS="$JAVA_OPTS -Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true -Dcom.sun.xml.ws.server.dispatch.HttpAdapter.dump=true" # Windows环境 set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true -Dcom.sun.xml.ws.server.dispatch.HttpAdapter.dump=true
注:之前设置系统属性无效,大概率是启动时机错误——必须在Guidewire应用启动前注入参数,而非运行时动态添加。
二、自定义Guidewire Web服务拦截器(服务端专属)
针对Contact Manager中框架生成的ABContactAPI服务,可通过Guidewire内置拦截器机制捕获SOAP消息:
- 实现自定义拦截器:创建继承
AbstractWebServiceInterceptor的类,重写请求/响应处理方法:
package com.yourcompany.gw.interceptors; import gw.web.service.AbstractWebServiceInterceptor; import gw.web.service.MessageContext; import javax.xml.soap.SOAPMessage; import java.io.StringWriter; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; public class SOAPLoggingInterceptor extends AbstractWebServiceInterceptor { private static final Logger logger = LogManager.getLogger(SOAPLoggingInterceptor.class); @Override public boolean handleRequest(MessageContext context) { logSOAPMessage("Incoming SOAP Request", context.getMessage()); return true; } @Override public void handleResponse(MessageContext context) { logSOAPMessage("Outgoing SOAP Response", context.getMessage()); } private void logSOAPMessage(String label, SOAPMessage soapMsg) { try (StringWriter writer = new StringWriter()) { soapMsg.writeTo(writer); logger.debug("{}:\n{}", label, writer.toString()); } catch (Exception e) { logger.error("Failed to log SOAP message", e); } } }
- 注册拦截器:在
gw/web/services.xml中找到ABContactAPI的服务配置,添加拦截器引用:
<service name="ABContactAPI"> <!-- 原有服务配置内容 --> <interceptors> <interceptor class="com.yourcompany.gw.interceptors.SOAPLoggingInterceptor"/> </interceptors> </service>
重启Contact Manager后,SOAP请求/响应会被记录到日志中。
三、第三方代理工具(无代码修改方案)
如果不想改动应用代码或配置,可通过代理工具捕获通信:
- TCPMon:监听本地端口,将请求转发到目标服务端,实时记录所有SOAP请求和响应的XML内容
- Charles Proxy:配置应用使用Charles作为HTTP代理,过滤SOAP请求路径,直接查看请求/响应的原始XML
- Wireshark:捕获服务器间的TCP流量,通过端口过滤(如8080、8443),解析HTTP协议提取SOAP消息
四、调试器实时查看(开发环境)
在IDE中调试Guidewire应用时,可通过断点查看SOAP消息:
- 服务端:在
com.sun.xml.ws.server.sei.SEIInvokerTube的processRequest方法设置断点,查看message变量对应的SOAPMessage内容 - 客户端:在
com.sun.xml.ws.client.sei.SEIStub的invoke方法设置断点,解析请求/响应的SOAP对象
内容的提问来源于stack exchange,提问作者Dragan Jovanović
相关产品推荐
相关产品推荐

