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

问题描述 投票:0回答:1

当我试图使用部署在Jboss EAP 7.1和My Server中的SOAP服务时,我收到了错误信息。Apache camel[2.24.3] 和 spring [5.2.2.RELEASE]。 部署在 Weblogic12c. 在交换发生后,它需要以字符串格式给出getMandatoryBody(),但它以DOMSource格式返回,而camel未能将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中部署服务器[使用camel和spring]时。其他应用服务器Tomcat 8.5.35和jboss-EAP7.2工作正常。

我试着把camel-spring-ws版本降级到[2.17.3],工作正常。

java spring soap apache-camel weblogic12c
1个回答
0
投票

你的异常清楚地表明,从getMandatoryBody()方法中,你得到的是javax.xml.transform.dom.DOMSource类型的值,而不是String值。所以,你可能需要把getMandatoryBody()的值读成DOMSource。

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中的String值,请对Exchange对象进行调试,看看那里有哪些可能的值。

© www.soinside.com 2019 - 2024. All rights reserved.