使用 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为空
基本的 Apache Camel LoadBalancer 故障转移示例