Apache camel 使用SpringWS客户端的驼峰路由偶尔会抛出javax.xml.transform.stax.StAXSource异常

Apache camel 使用SpringWS客户端的驼峰路由偶尔会抛出javax.xml.transform.stax.StAXSource异常,apache-camel,spring-ws,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发送一个

我有一条骆驼“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字符串(根据我所做的任何调试日志记录)。此外,这个精确的代码在大多数情况下都能工作,只是偶尔会失败。它看起来是随机的

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


正是这种随机性让这一切变得如此疯狂。你知道我应该寻找什么来确保这种情况永远不会发生吗?

问题不在于Camel,而在于Spring WS。在WS-template配置中修改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-config和一个测试用例

修改transformerFactoryClass到底修复了什么?是否Spring WS的默认transformerFactoryClass本质上是不可靠的,这是一个更可靠的替代品?Spring WS没有默认的transformerFactoryClass,实现会退回到javax.xml.transform.TransformerFactory。它再次尝试定位默认为“com.sun.org.apache.xalan.internal.xsltc.trax.transformerfactorympl”的“javax.xml.transform.TransformerFactory”系统属性。随机问题可能是因为javax.xml.transform.Transformer类不是线程安全的,并且使用不同的模板(原型)并显式设置transformerFactoryClass可以工作