WebServicesTemplate と Jxb2Marshaller をマーシャリング エンジンとして使用して、Spring WS クライアントの要求と応答を表示することは可能ですか?
生のxmlに対してアクションを実行するのではなく、xmlをログに記録したいだけです。
spring-ws
ドキュメント
を参照してください: http://static.springsource.org/spring-ws/sites/2.0/reference/html/common.html#logging
標準の Commons Logging インターフェイスを介してメッセージをログに記録できます。
すべてのサーバー側メッセージをログに記録するには、単純に
org.springframework.ws.server.MessageTracing
ロガーのレベルを DEBUG または TRACE に設定します。デバッグ レベルでは、ペイロード ルート要素のみがログに記録されます。TRACE レベルでは、メッセージの内容全体。送信されたメッセージのみをログに記録したい場合は、org.springframework.ws.server.MessageTracing.sent
ロガーを使用してください。またはorg.springframework.ws.server.MessageTracing.received
受信したメッセージをログに記録します。クライアント側には、同様のロガーが存在します:
org.springframework.ws.client.MessageTracing.sent
およびorg.springframework.ws.client.MessageTracing.received
.
それを理解することができました - このような ClientInterceptor を WebServicesTemplate インターセプターに追加すると:
package com.wuntee.interceptor;
import java.io.ByteArrayOutputStream;
import org.apache.log4j.Logger;
import org.springframework.ws.client.WebServiceClientException;
import org.springframework.ws.client.support.interceptor.ClientInterceptor;
import org.springframework.ws.context.MessageContext;
public class LoggerInterceptor implements ClientInterceptor {
private Logger logger = Logger.getLogger(this.getClass().getName());
public boolean handleFault(MessageContext context) throws WebServiceClientException {
return false;
}
public boolean handleRequest(MessageContext context) throws WebServiceClientException {
logger.info("handleRequest");
logRequestResponse(context);
return true;
}
public boolean handleResponse(MessageContext context) throws WebServiceClientException {
logger.info("handleResponse");
logRequestResponse(context);
return true;
}
private void logRequestResponse(MessageContext context){
try{
logger.info("Request:");
ByteArrayOutputStream out = new ByteArrayOutputStream();
context.getRequest().writeTo(out);
byte[] charData = out.toByteArray();
String str = new String(charData, "ISO-8859-1");
logger.info(str);
} catch(Exception e){
logger.error("Could not log request: ", e);
}
if(context.hasResponse()){
try{
logger.info("Response:");
ByteArrayOutputStream out = new ByteArrayOutputStream();
context.getResponse().writeTo(out);
byte[] charData = out.toByteArray();
String str = new String(charData, "ISO-8859-1");
logger.info(str);
} catch(Exception e){
logger.error("Could not log response: ", e);
}
}
}
}