gpt4 book ai didi

java - 处理畸形 SOAP 故障

转载 作者:行者123 更新时间:2023-12-02 13:29:52 25 4
gpt4 key购买 nike

我正在针对产生不符合规范的错误的服务器编写 SOAP 客户端。具体来说,故障原因 ( spec ) 的 Text 元素中缺少 lang 属性。我正在使用 Spring WS 2.4.0。有没有办法在响应解析为 SaajSoapMessage 之前拦截响应并注入(inject)属性?我尝试创建一个 ClientInterceptor,但是 xml 在它到达拦截器时已经被解析了。我需要创建自己的 MessageFactory 吗?

最佳答案

我在 this answer 的帮助下解决了这个问题和 this answer

当我实例化 WebServiceGatewaySupport 时,我添加了一个 ClientInterceptor,在其中配置了 handleFault() 方法:

@Override
public boolean handleFault(MessageContext messageContext) throws WebServiceClientException {
LOGGER.debug("intercepted a fault.");
TransformerFactory transformerFactory = TransformerFactory.newInstance();
WebServiceMessage response = messageContext.getResponse();
Source source = response.getPayloadSource();
StreamResult streamResult = new StreamResult(new StringWriter());

try {
Transformer displayTransformer = transformerFactory.newTransformer();
displayTransformer.transform(source, streamResult);
LOGGER.debug("\t>> initial response\n" + streamResult.getWriter().toString());

StreamSource xslSource = new StreamSource(new File(
FaultInterceptor.class.getResource("/SoapFaultFix.xsl").getFile()
));
Transformer modifyingTransformer = transformerFactory.newTransformer(xslSource);
modifyingTransformer.transform(source, response.getPayloadResult());

} catch (TransformerException e) {
e.printStackTrace();
}

return true;
}

这只是获取源 xml 并通过 xsl 转换运行它。从 identity transformation 开始很重要这样你就不会丢失内容。然后我添加了属性和值,然后放入现有值。我的 SoapFaultFix.xsl 看起来像这样:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"
>
<xsl:template match="/ | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//soapenv:Fault/soapenv:Reason/soapenv:Text">
<soapenv:Text>
<xsl:attribute name="xml:lang">en</xsl:attribute>
<xsl:value-of select="."/>
</soapenv:Text>
</xsl:template>
</xsl:stylesheet>

我喜欢这种方法,因为我发现使用纯 Java 深入 DOM 非常困难,而且我可以轻松扩展 xsl 以进行其他更改。

关于java - 处理畸形 SOAP 故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43234266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com