SpringWS-WebServicesTemplate/Jaxb2Marshaller客户端视图原始xml?

SpringWS-WebServicesTemplate/Jaxb2Marshaller客户端视图原始xml?,jaxb,spring-ws,Jaxb,Spring Ws,是否可以使用WebServicesTemplate和Jxb2Marshaller作为封送引擎来查看SpringWS客户端的请求和响应 我只是想记录xml,而不是对原始xml执行任何操作。能够解决这个问题-如果您向WebServicesTemplate拦截器添加这样的ClientInterceptor: package com.wuntee.interceptor; import java.io.ByteArrayOutputStream; import org.apache.log4j.Lo

是否可以使用WebServicesTemplate和Jxb2Marshaller作为封送引擎来查看SpringWS客户端的请求和响应


我只是想记录xml,而不是对原始xml执行任何操作。

能够解决这个问题-如果您向WebServicesTemplate拦截器添加这样的ClientInterceptor:

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);
            }
        }
    }

}

请参阅
SpringWS
文档:

您可以通过标准Commons日志界面记录消息:

要记录所有服务器端消息,只需将
org.springframework.ws.server.MessageTracing
记录器设置为调试或跟踪级别。在调试级别,只记录有效负载根元素;在跟踪级别上,显示整个消息内容。如果您只想记录发送的消息,请使用
org.springframework.ws.server.MessageTracing.sent
logger;或者
org.springframework.ws.server.MessageTracing.received
来记录收到的消息

在客户端,存在类似的记录器:
org.springframework.ws.client.MessageTracing.sent
org.springframework.ws.client.MessageTracing.received


此解决方案的唯一问题是,如果在解组响应时出现问题,将永远不会调用HandlerResponse方法。我还没有找到解决这个问题的办法。