2015-02-23 45 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); 
    } 
}}