当我试图使用部署在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],工作正常。
你的异常清楚地表明,从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对象进行调试,看看那里有哪些可能的值。