2015-02-23 84 views
0

我在我的项目中使用JAX-WS作为webservices。我想记录这些Web服务的每个请求和响应。目前,我正在成功记录每个请求/响应,但是为了安全起见,我希望删除标题部分,并保留正文,我在我的SOAPHandler中使用此方法在应用程序日志中写入:仅记录肥皂请求和响应主体Jax WS

private void logToSystemOut(SOAPMessageContext smc) { 
     Logger logger = Logger.getLogger(LogHandler.class); 
     Boolean outboundProperty = (Boolean) smc 
       .get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
     if (outboundProperty.booleanValue()) { 
      logger.info("Outbound message:"); 
     } else { 
      logger.info("Inbound message:"); 
     } 

     SOAPMessage message = smc.getMessage(); 
     try { 
      Source source = message.getSOAPPart().getContent(); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      Transformer transformer = TransformerFactory.newInstance() 
        .newTransformer(); 
      transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
      transformer.setOutputProperty(
        "{http://xml.apache.org/xslt}indent-amount", "3"); 
      transformer.transform(source, new StreamResult(baos)); 
      logger.info(baos.toString()); 
     } catch (Exception e) { 
      logger.warn("Exception in handler: " + e); 
     } 
    } 

这当然会记录每个请求/响应,而不区分标题和正文。我尝试使用message.getSOAPBody(),但它保持记录为空。

所有的建议都欢迎。

PS:这是针对message.getSOAPBody()的返回是[S:主体:空]

回答

0

我已经成功解决了这个问题用于SOAP报头中的detachnode方法如下:

message.getSOAPHeader().detachNode(); 

这里的代码是如何成为一个代码示例(注意我是如何测试的SOAPHEADER是否非空,否则它会抛出一个空指针异常):

private void logToSystemOut(SOAPMessageContext smc) { 
    Logger logger = Logger.getLogger(LogHandler.class); 
    Boolean outboundProperty = (Boolean) smc 
      .get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
    if (outboundProperty.booleanValue()) { 
     logger.info("Outbound message:"); 
    } else { 
     logger.info("Inbound message:"); 
    } 

    SOAPMessage message = smc.getMessage(); 
    try { 
     if(message.getSOAPHeader()!=null) 
     message.getSOAPHeader().detachNode(); 
     Source source = message.getSOAPPart().getContent(); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3"); 
     transformer.transform(source, new StreamResult(baos)); 
     logger.info(baos.toString()); 
    } catch (Exception e) { 
     logger.warn("Exception in handler: " + e); 
    } 
}}