使用 apache-camel [2.24.3] 使用 SOAP 服务时出错

Posted

技术标签:

【中文标题】使用 apache-camel [2.24.3] 使用 SOAP 服务时出错【英文标题】:Error while consuming SOAP service using apache-camel[2.24.3] 【发布时间】:2020-09-07 16:09:09 【问题描述】:

我在尝试使用 SOAP 服务时遇到错误,该服务部署在 Jboss EAP 7.1 和 My Server 中,带有 Apache camel[2.24.3] 和 spring [5.2.2.RELEASE]部署在 Weblogic12c 中。交换发生后,它需要以字符串格式提供 getMandatoryBody() 但它在 DOMSource 中返回,骆驼无法将 DOMService 转换为字符串。

我得到的例外是:

No body available of type: java.lang.String but has value: javax.xml.transform.dom.DOMSource@37279c86 of type: javax.xml.transform.dom.DOMSource on: Message[ID-everest2-1589967071589-0-11]. Caused by: Error during type conversion from type: java.lang.String to the required type: java.lang.String with value [Body is instance of java.xml.transform.Source] due javax.xml.transform.TransformerException: java.lang.RuntimeException: com.ctc.wstx.exc.WstxIOException: Stream closed. Exchange[ID-everest2-1589967071589-0-10]. Caused by: [org.apache.camel.TypeConversionException - Error during type conversion from type: java.lang.String to the required type: java.lang.String with value [Body is instance of java.xml.transform.Source] due javax.xml.transform.TransformerException: java.lang.RuntimeException: com.ctc.wstx.exc.WstxIOException: Stream closed

只有当我在 weblogic 12c 中部署我的服务器 [with camel and spring] 时才会出现问题。其他应用服务器 Tomcat 8.5.35 和 jboss-EAP7.2 。运行正常。

我尝试将 camel-spring-ws 版本降级到 [2.17.3] 它工作正常。

【问题讨论】:

【参考方案1】:

您的异常清楚地表明,从 getMandatoryBody() 方法中,您将获得 javax.xml.transform.dom.DOMSource 类型的值,而不是 String 值。 因此,您可能需要将 getMandatoryBody() 的值读取为 DOMSource。 从 DOMSource 到 String 的转换很容易使用 Java 代码:

import java.io.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;

//method to convert Document to String
public String getStringFromDocument(DOMSource domSource)

    try
    
       StringWriter writer = new StringWriter();
       StreamResult result = new StreamResult(writer);
       TransformerFactory tf = TransformerFactory.newInstance();
       Transformer transformer = tf.newTransformer();
       transformer.transform(domSource, result);
       return writer.toString();
    
    catch(TransformerException ex)
    
       ex.printStackTrace();
       return null;
    

如果您确定 Exchange 中的字符串值,请对 Exchange 对象执行调试以查看那里存在哪些可能的值。

【讨论】:

在其他应用服务器(Jboss EAP 7.2 和 tomcat 8.5.35)交换它的返回字符串值后。只有当我使用weblogic 12c时,才会出现这个问题。我尝试了上面的解决方案,当它有更多数据时,它无法转换为字符串。

以上是关于使用 apache-camel [2.24.3] 使用 SOAP 服务时出错的主要内容,如果未能解决你的问题,请参考以下文章

apache-camel - 在spring xml中读取java常量

apache-camel调度程序组件交换属性TIMER_NAME为空

如何延迟spring bean启动?

基本的 Apache Camel LoadBalancer 故障转移示例

使用 Guice 和 Undertow 在 Camel 中使用 rest Servlet

如何在apache camel中附加速度文件内容