我在尝试使用 SOAP 服务时遇到错误,该服务使用 Apache Camel[2.24.3] 和 spring [5.2.2.RELEASE] 部署在 Jboss EAP 7.1 和 My Server 中部署在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。 使用 Java 代码可以轻松地将 DOMSource 转换为 String:
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 对象执行调试以查看其中存在哪些可能的值。
关于java - 使用 apache-camel[2.24.3] 使用 SOAP 服务时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61927557/