【问题标题】:Spring WS WebServicesTemplate/Jaxb2Marshaller client view raw xml?Spring WS WebServicesTemplate/Jaxb2Marshaller 客户端查看原始 xml?
【发布时间】:2010-05-11 17:10:41
【问题描述】:

是否可以使用 WebServicesTemplate 和 Jxb2Marshaller 作为编组引擎查看 Spring WS 客户端的请求和响应?

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

【问题讨论】:

    标签: jaxb spring-ws


    【解决方案1】:

    请参阅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.sentorg.springframework.ws.client.MessageTracing.received

    【讨论】:

      【解决方案2】:

      能够弄清楚 - 如果您将这样的 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);
                  }
              }
          }
      
      }
      

      【讨论】:

      • 此解决方案的唯一问题是,如果在解组响应时出现问题,您的 handleResponse 方法将永远不会被调用。我还没有找到解决这个问题的方法。
      猜你喜欢
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多