【问题标题】:Camel route using spring-ws client occasionally throws javax.xml.transform.stax.StAXSource exception使用spring-ws客户端的骆驼路由偶尔会抛出javax.xml.transform.stax.StAXSource异常
【发布时间】:2013-01-25 21:17:13
【问题描述】:

我有一个骆驼'seda'路线,大致包含代码:

JaxbDataFormat jaxb = new JaxbDataFormat(false);
jaxb.setContextPath("com.example.data.api");

from("seda:validate")
   .marshal(jaxb)
   .to("spring-ws:" + getDataServiceURL())
   .unmarshal(jaxb)

我从 com.example.data.api 发送一个对象,JaxbDataFormat 格式化程序将它设置为一个 SOAP 请求,并通过 wo spring-ws 将其传递给我的服务。这在大多数情况下都很有效。

我说“大多数”是因为 spring-ws 时不时地抛出一个异常,如下所示:

org.springframework.ws.client.WebServiceTransformerException: Transformation error: Can't transform a Source of type javax.xml.transform.stax.StAXSource; nested exception is javax.xml.transform.TransformerException: Can't transform a Source of type javax.xml.transform.stax.StAXSource
    at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:608)
    at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:537)
    at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:492)
    at org.springframework.ws.client.core.WebServiceTemplate.sendSourceAndReceive(WebServiceTemplate.java:479)
    at org.springframework.ws.client.core.WebServiceTemplate.sendSourceAndReceive(WebServiceTemplate.java:470)
    at org.apache.camel.component.spring.ws.SpringWebserviceProducer.process(SpringWebserviceProducer.java:81)
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)

其中的核心是这条错误消息:“无法转换 javax.xml.transform.stax.StAXSource 类型的源”。

这些都没有意义。 Jaxb 编组已经确保所讨论的对象是一个 XML 字符串(根据我所做的任何调试日志记录)。此外,这个确切的代码大部分时间都可以工作,只是偶尔会失败。它看起来是随机的。

例如,我在几分钟前运行了一个测试,我向我的路由发送了一条消息并收到了这个错误。然后我重新启动了我的服务并重新发送 exact 相同的消息......它就像一个魅力。相同的代码;相同的环境;相同的测试——两​​个不同的结果。

正是这种随机性让这一切变得如此令人抓狂。我应该寻找什么以确保这种情况永远不会发生?

【问题讨论】:

    标签: apache-camel spring-ws


    【解决方案1】:

    问题不在于 Camel,而在于 Spring-WS。在 WS 模板配置中修改 transformerFactoryClass 会起作用

    <bean id="baseCamelMarshallerWSTemplate" class="org.springframework.ws.client.core.WebServiceTemplate" scope="prototype">
            <constructor-arg ref="messageFactory" />
            <property name="messageSender">
                <ref bean="httpSender"/>
            </property>
            <property name="checkConnectionForError" value="true"/>
            **<property name="transformerFactoryClass" value="com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl"/>**
        </bean>
    

    如果你仍然遇到问题,请分享 spring WS 配置和测试用例

    【讨论】:

    • 究竟是什么修改了transformerFactoryClass 修复?是不是 Spring-WS 的默认的 transformerFactoryClass 本身就是不可靠的,这是一个更可靠的替代品?
    • Spring-WS 没有默认的transformerFactoryClass,实现回退到javax.xml.transform.TransformerFactory。它再次尝试定位默认为“com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl”的“javax.xml.transform.TransformerFactory”系统属性。随机问题可能是因为 javax.xml.transform.Transformer 类不是线程安全的,并且使用了不同的模板(原型)并明确设置了 transformerFactoryClass 工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    相关资源
    最近更新 更多