【发布时间】:2020-09-23 07:56:17
【问题描述】:
我正在使用 Spring-Integration 代理 SOAP Web 服务。我使用一些入站网关收到请求,经过一些转换后,消息通过ws:outbound-gateway。我扩展了 ClientInterceptor 并定义了一个名为 WSLoggingInterceptor 的自定义名称,它记录 XML 请求和响应并将其添加到我的 ws:outbound-gateway。
我想在日志中添加一个标识符,以便在同一消息流中关联发送请求和接收响应的日志。我在消息流开始的集成标头中定义了一些名为messageId 的UUID。我的问题是如何在此类拦截器中拥有 messageId 或集成消息的其他集成标头?有什么办法吗?
谢谢。
下面是我的拦截器类。
package com.asansoft.interceptors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.ws.client.WebServiceClientException;
import org.springframework.ws.client.support.interceptor.ClientInterceptor;
import org.springframework.ws.context.MessageContext;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* Created by Mohammad Ghoreishi.
* moha.gh22@gmail.com
*/
@Component(value = "wsLoggingInterceptor")
public class WSLoggingInterceptor implements ClientInterceptor {
private final Logger requestLogger = LoggerFactory.getLogger("WSRequest");
private final Logger responseLogger = LoggerFactory.getLogger("WSResponse");
private final Logger errorLogger = LoggerFactory.getLogger("WSError");
private List<String> exclusionRequestNSList = new ArrayList<>();
private List<String> exclusionResponseNSList = new ArrayList<>();
@Override
public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
messageContext.getRequest().writeTo(byteArrayOutputStream);
requestLogger.info("Web Service Request : " + removeRequestCredentials(removeSecurityHeaders(new String(byteArrayOutputStream.toByteArray(), StandardCharsets.UTF_8))));
} catch (IOException e) {
errorLogger.error(e.getMessage(), e);
}
return true;
}
@Override
public boolean handleResponse(MessageContext messageContext) throws WebServiceClientException {
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
messageContext.getResponse().writeTo(byteArrayOutputStream);
responseLogger.info("Web Service Response : " + removeResponseCredentials(removeSecurityHeaders(new String(byteArrayOutputStream.toByteArray(), StandardCharsets.UTF_8))));
} catch (IOException e) {
errorLogger.error(e.getMessage(), e);
}
return true;
}
@Override
public boolean handleFault(MessageContext messageContext) throws WebServiceClientException {
try {
long rs = (new Date()).getTime() - responseTime;
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
messageContext.getResponse().writeTo(byteArrayOutputStream);
errorLogger.error("Web Service Response : " + removeResponseCredentials(removeSecurityHeaders(new String(byteArrayOutputStream.toByteArray(), StandardCharsets.UTF_8))));
errorLogger.error("Response Time : " + rs + "ms");
} catch (IOException e) {
errorLogger.error(e.getMessage(), e);
}
return true;
}
@Override
public void afterCompletion(MessageContext messageContext, Exception ex) throws WebServiceClientException {
// Blah blah blah
}
private String removeSecurityHeaders(String xmlString) {
// Blah blah blah
}
private String removeRequestCredentials(String xmlString) {
// Blah blah blah
}
private String removeResponseCredentials(String xmlString) {
// Blah blah blah
}
public List<String> getExclusionRequestNSList() {
return exclusionRequestNSList;
}
public List<String> getExclusionResponseNSList() {
return exclusionResponseNSList;
}
public void setExclusionRequestNSList(List<String> exclusionRequestNSList) {
this.exclusionRequestNSList = exclusionRequestNSList;
}
public void setExclusionResponseNSList(List<String> exclusionResponseNSList) {
this.exclusionResponseNSList = exclusionResponseNSList;
}
}
【问题讨论】:
标签: spring-integration spring-ws