Spring DSL を使用して Camel SOAP プロキシ サービスを構成しました。SOAP応答メッセージ用に内部にカスタムヘッダーを設定する必要があることがわかるまで、すべてがうまく機能していました。
spring-ws コンポーネントと最新の Camel 2.10.0 を使用しています。
これが私の春のルートの例です(私はいくつかの無関係な変換をスキップしました):
<bean id="ahc_binding" class="ru.fabit.ExampleAHCBinding"/>
<bean id="response_assembler" class="ru.fabit.ExampleResponseAssembler"/>
<camel:camelContext id="get_regions">
<camel:dataFormats>
<camel:jaxb id="main_jaxb" prettyPrint="true"
contextPath="ru.fabit.rosstelecom.webservice.models.smev" />
</camel:dataFormats>
<camel:route>
<camel:from uri="spring-ws:rootqname:{http://fabit.ru/service}getRegionsRequest?endpointMapping=#endpointMapping"/>
<camel:unmarshal ref="main_jaxb"/>
<camel:to uri="ahc:http://localhost:9001/service/regions"/>
<camel:unmarshal ref="main_jaxb"/>
<camel:process ref="response_assembler"/>
</camel:route>
</camel:camelContext>
そして、これが ExampleResponseAssembler.java ("response_assemblyr" Bean) のコードです。ルートの最後の要素です。そして、何らかの外部サービス (実際には AHC コンポーネントから) からマーシャリングされていない応答オブジェクトを取得し、ルート全体の適切な SOAP 応答を組み立てる必要があります。
public class ExampleResponseAssembler implements Processor {
@Override
public void process(final Exchange exchange) throws Exception {
final Object responseMessage = exchange.getIn().getBody();
final GetRegionsResponse regionsResponse = new GetRegionsResponse();
final MessageDataType messageData = new MessageDataType();
final AppDataType appData = new AppDataType();
appData.setAny(responseMessage);
messageData.setAppData(appData);
regionsResponse.setMessageData(messageData);
exchange.getOut().setBody(regionsResponse);
final HeaderType header = exchange.getProperty("exampleHeader", HeaderType.class);
exchange.getOut().setHeader("CamelSpringWebServiceSoapHeader", header);
}
}
Body をそのように設定すると、正しく解析されます。SaopUI で見ることができます。しかし、ヘッダーはありません。それは私が推測する SOAP ヘッダーを設定する単純なアプローチでした。そして、これに関する関連情報が見つかりません。
この問題に関する JIRA チケットをいくつか見つけることができましたが、リンク、いくつかのカスタム SOAP ヘッダーの設定を処理する方法はまだ不明です。そして、チケットは「未解決」としてマークされます。ここでブードゥーの魔法をオーバーライドする必要があるかもしれません (MessageFactory、MessageSender などをオーバーライドします)。些細な問題のようですが…