2

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 などをオーバーライドします)。些細な問題のようですが…

4

2 に答える 2

1

これを修正する可能性のあるパッチが添付されている問題のようです。

https://issues.apache.org/jira/browse/CAMEL-4515

camel-spring-ws から派生した独自のコンポーネントを実装することもできます (ただし、テストしていません)。

オーバーライドされた SpringWebServiceConsumer で、ヘッダーの設定を追加します (交換からコピー)。オーバーライドされた SpringWebServiceEndpoint で createConsumer をオーバーライドして、カスタム コンシューマーを作成します。オーバーライドされた SpringWebServiceComponent で createEndpoint をオーバーライドして、カスタム エンドポイントを作成します。

おそらく、その周りに他のコードを使用して、トリックを実行する必要があります。次に、新しいコンポーネントからルートを作成します。

camel ソースをダウンロードして、Spring ws コンポーネントを確認することをお勧めします。コードはそれほど多くありません。

于 2012-07-31T14:35:28.807 に答える