【问题标题】:Error while consuming SOAP service using apache-camel[2.24.3]使用 apache-camel [2.24.3] 使用 SOAP 服务时出错
【发布时间】: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] 它工作正常。

【问题讨论】:

    标签: java spring soap apache-camel weblogic12c


    【解决方案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时,才会出现这个问题。我尝试了上面的解决方案,当它有更多数据时,它无法转换为字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多