【问题标题】:Logging soap requests and responses body only Jax WS仅记录 soap 请求和响应正文 Jax WS
【发布时间】:2023-03-14 08:00:01
【问题描述】:

我在我的项目中将 JAX-WS 用于 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:这是 message.getSOAPBody() 的返回值是 [S:Body: null]

【问题讨论】:

    标签: web-services soap jax-ws


    【解决方案1】:

    我已经成功解决了使用 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);
        }
    }}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 2023-04-02
      • 2011-11-02
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多