大まかにコードを含むラクダの「セダ」ルートがあります:
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 リクエストとして設定し、それを 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 文字列であることを既に確認しています (私が行うデバッグ ログによると)。さらに、この正確なコードはほとんどの場合機能し、失敗するのはまれです。ランダムに表示されます。
たとえば、ほんの数分前に、ルートにメッセージを送信してこのエラーが発生したテストを実行しました。その後、サービスを再起動し、まったく同じメッセージを再送信しました...そして、それは魅力的に機能しました。同じコード; 同じ環境; 同じテスト -- 2 つの異なる結果。
これを非常に狂わせているのは、このランダム性です。これが決して起こらないようにするために私が探しているべきアイデアはありますか?