3

我在纯 java 中创建了 SOAP 客户端。我还实现了 SOAPHandler 来跟踪 SOAP 请求和响应。但是当我看到系统输出时,请求中缺少标头部分。请注意,我正在调用企业服务,并且需要强制安全标头才能调用该服务。我在响应中使用我的安全标头得到了正确的响应,并且正在 sysout。来自 SOAPHandler 的空白标头跟踪可能是什么问题?下面是我的处理程序代码:

public class SOAPLoggingHandler implements SOAPHandler<SOAPMessageContext> {

    private static final Logger log = LoggerFactory.getLogger(SOAPLoggingHandler.class);

    public boolean handleMessage(SOAPMessageContext context) {
        log.info("handleMessage");
        logToSystemOut(context);
        return true;
    }

    public boolean handleFault(SOAPMessageContext context) {
        log.info("SOAP Fault Occur");
        logToSystemOut(context);
        return true;
    }

    public void close(MessageContext context) {
        log.info("close");
    }

    public Set<QName> getHeaders() {
        log.info("getHeaders");
        return null;
    }

    protected void logToSystemOut(SOAPMessageContext smc) {
        final Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        final String message = !outboundProperty.booleanValue() ? "Web Service Response\n" : "Web Service Request\n";
        logMessage(smc, message);
    }

    protected void logToSystemOut(SOAPMessageContext smc, String message) {
        logMessage(smc, message);
    }

    private void logMessage(SOAPMessageContext smc, String message) {

        try {
            final ByteArrayOutputStream oStream = new ByteArrayOutputStream();
            final Transformer transformer = TransformerFactory.newInstance().newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
            transformer.transform(new DOMSource(smc.getMessage().getSOAPPart()), new StreamResult(oStream));
            oStream.close();
            log.info(message + new String(oStream.toByteArray()));
        } catch (final Exception e) {
            log.warn("Failed to log web service message", e);
        }
        //some custom logging going on below - could be ignored
        SomeLogger someLoggerObj = SomeLogger.getInstance();
        try {
            someLoggerObj.logSomeMessage(smc, message);
        } catch (SOAPException e) {
            log.error("SOAP Exception occurred :", e);
        } catch (TransformerException e) {
            log.error("TransformerException Exception occurred :", e);
        }
    }

}

我的标题被视为:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header/>
4

1 回答 1

0

本周我遇到了完全相同的问题,我有 5 个带有 TLS 和 SAML 的 SOAP 调用链,以及使用 AXIS 和 CXF 实现的混合服务,在 OpenJDK 11 上的相同 Tomcat 9 下运行。问题仅发生在生产服务器(RedHat 服务器)上,我无法在我的开发机器上重现它,标头完全被 java 客户端删除,无法在服务器上调试。

我最终在目标服务器上安装了 JDK 1.8 上的专用 Tomcat 8.5,以运行与 AXIS 服务分开的 CXF 服务。如果有人有如此复杂的配置,希望这会有所帮助,这不是一个解决方案,而是一种解决方法。

于 2021-09-03T08:59:27.723 回答