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

标签 java spring soap apache-camel weblogic12c

我在尝试使用 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/

相关文章:

java - Eclipse SonarLint 误报 "Unused assignments should be removed (java:S1854)"

java - Java 中的 Haskell 样式值构造函数

java - 尝试在 Android 中添加 ClickListener 时出现 NullPointerException.. 为什么?

java - Spring + Maven + Hadoop

java - Jackson 序列化期间出现异常

带 chrome 55 的 spring boot 1.4 ssl

java - 在 Spring MVC 中以 XML 形式获取 SOAP 请求

java - 使用Java获取Kubernetes API key

c# - 使用 WSDL (SOAP) 在 C#/.NET 解决方案中集成 PayPal

web-services - 为什么我的 Coldfusion Soap Web 服务的生产速度比开发速度慢 10 倍?