使用spring-ws客户端的Camel路由偶尔会抛出javax.xml.transform.stax.StAXSource异常

时间:2013-01-25 21:17:13

标签: apache-camel spring-ws

我有一条骆驼'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以实际发送到我的服务。这大部分时间都像魅力一样。

我说“大多数”因为偶尔会出现这样的异常:

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字符串(根据我所做的任何调试日志记录)。此外,这个确切的代码大部分时间都有效,偶尔也会失败。它似乎是随机的。

例如,我在几分钟前进行了一次测试,在那里我向我的路线发送了一条消息并得到了这个错误。然后我重新启动了我的服务并重新发送完全相同的消息......它就像一个魅力。相同的代码;相同的环境;相同的测试 - 两个不同的结果。

正是这种随机性使得这令人抓狂。任何想法,我应该寻找什么,以确保永远发生?

1 个答案:

答案 0 :(得分: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配置和测试用例