Spring SLF4j 的 ws 日志记录问题

Spring ws logging issue with SLF4j

您好,我正在使用 spring ws + slf4j 进行日志记录。在 application.properties

中使用以下属性记录 soap 请求和响应
logging.level.org.springframework.ws.client.MessageTracing.sent=DEBUG
logging.level.org.springframework.ws.server.MessageTracing.sent=DEBUG
logging.level.org.springframework.ws.client.MessageTracing.received=TRACE
logging.level.org.springframework.ws.server.MessageTracing.received=TRACE

它不记录请求和响应,而是打印以下对象,

13:13:06.155 [main] DEBUG o.s.ws.client.MessageTracing.sent - Sent request  [SaajSoapMessage {http://ws.sample.customer.com/}getCustomerDetails]
13:13:06.411 [main] DEBUG o.s.w.client.MessageTracing.received - Received   response [SaajSoapMessage  {http://ws.sample.customer.com/}getCustomerDetailsResponse] for request [SaajSoapMessage {http://ws.sample.customer.com/}getCustomerDetails]

我正在使用以下方式调用网络服务:

 return (JAXBElement) getWebServiceTemplate().marshalSendAndReceive(uri, request, webServiceMessage -> {
            SoapMessage soapMessage = (SoapMessage) webServiceMessage;
            Marshaller marshaller = getMarshaller();
            marshaller.marshal(jaxbElement, soapMessage.getSoapHeader().getResult());
        });

我不知道为什么它不打印请求和响应。我还尝试使用 "SoapEnvelopeLoggingInterceptor" 或 "ClientInterceptor" 拦截请求和响应,但没有任何触发但得到了响应对象。

public class LogbackInterceptor implements ClientInterceptor {

private static final Logger logger = LoggerFactory.getLogger(LogbackInterceptor.class);

 public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
       logger.debug("Sent request by sample [" + messageContext.getRequest() + "]");
       return true;
 }

 public boolean handleResponse(MessageContext messageContext) throws WebServiceClientException {
       logger.debug("Received response by sample [" + messageContext.getResponse() + "] for request [" +
                            messageContext.getRequest() + "]");
       return true;
 }

@Override
public boolean handleFault(MessageContext messageContext) throws WebServiceClientException {
    // TODO Auto-generated method stub
    return false;
}

@Override
public void afterCompletion(MessageContext messageContext, Exception ex) throws WebServiceClientException {
    // TODO Auto-generated method stub

}

}

@Component
public class LoggingInterceptor  extends SoapEnvelopeLoggingInterceptor{

private static final Logger logger = LoggerFactory.getLogger(LoggingInterceptor.class);

@Override
protected void logMessage(String message) {
    System.out.println("Entered log message");
    logger.debug("LoggingInterceptor::logMessage");
    logger.debug(message);
/* Example, here you could be logging to DB or whatever you want */
}
}

如果有人帮我解决这个问题就好了

终于找到解决方法希望对大家有帮助,

我们应该在 WebServiceTemplate 中注册 "ClientInterceptor",否则 spring 将不会触发 "ClientInterceptor"。下面的代码非常有效,现在我可以拦截请求和响应了。

WebServiceTemplate webServiceTemplate = getWebServiceTemplate();
ClientInterceptor[] interceptors = new ClientInterceptor[1];
interceptors[0] = new LogbackInterceptor();
webServiceTemplate.setInterceptors(interceptors);