Web services 记录soap请求和响应只包含Jax WS

Web services 记录soap请求和响应只包含Jax WS,web-services,soap,jax-ws,Web Services,Soap,Jax Ws,我在项目中使用JAX-WS作为Web服务。我想记录这些Web服务的每个请求和响应。目前,我正在成功地记录每个请求/响应,但出于安全原因,我希望删除标题部分并保留正文,我在SOAPHandler中使用此方法在应用程序日志中写入: private void logToSystemOut(SOAPMessageContext smc) { Logger logger = Logger.getLogger(LogHandler.class); Boolean outbou

我在项目中使用JAX-WS作为Web服务。我想记录这些Web服务的每个请求和响应。目前,我正在成功地记录每个请求/响应,但出于安全原因,我希望删除标题部分并保留正文,我在SOAPHandler中使用此方法在应用程序日志中写入:

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(),但它一直记录为null

欢迎所有推荐


PS:这是消息的返回。getSOAPBody()是[S:Body:null]

我已成功解决了使用detachnode方法处理SOAP标头的问题,如下所示:

 message.getSOAPHeader().detachNode();
下面是代码如何变为的代码示例(请注意,我是如何测试soapHeader是否为非null的,因为否则它会引发null指针异常):

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