最新の安定バージョンについては、Spring Integration 6.5.0 を使用してください!

ルーターと Spring 式言語 (SpEL)

ルーティングロジックは単純な場合があり、そのための個別のクラスを作成して Bean として構成することは、やり過ぎに見えるかもしれません。Spring Integration 2.0 の時点で、SpEL を使用して、以前はカスタム POJO ルーターを必要とした単純な計算を実装できる代替手段を提供しています。

Spring 式言語の詳細については、「 Spring Framework リファレンスガイド」の関連する章を参照してください。

一般に、次の例に示すように、SpEL 式が評価され、その結果がチャネルにマッピングされます。

<int:router input-channel="inChannel" expression="payload.paymentType">
    <int:mapping value="CASH" channel="cashPaymentChannel"/>
    <int:mapping value="CREDIT" channel="authorizePaymentChannel"/>
    <int:mapping value="DEBIT" channel="authorizePaymentChannel"/>
</int:router>

次の例は、Java で構成された同等のルーターを示しています。

@Router(inputChannel = "routingChannel")
@Bean
public ExpressionEvaluatingRouter router() {
    ExpressionEvaluatingRouter router = new ExpressionEvaluatingRouter("payload.paymentType");
    router.setChannelMapping("CASH", "cashPaymentChannel");
    router.setChannelMapping("CREDIT", "authorizePaymentChannel");
    router.setChannelMapping("DEBIT", "authorizePaymentChannel");
    return router;
}

次の例は、Java DSL で構成された同等のルーターを示しています。

@Bean
public IntegrationFlow routerFlow() {
    return IntegrationFlow.from("routingChannel")
        .route("payload.paymentType", r -> r
            .channelMapping("CASH", "cashPaymentChannel")
            .channelMapping("CREDIT", "authorizePaymentChannel")
            .channelMapping("DEBIT", "authorizePaymentChannel"))
        .get();
}

さらに簡素化するために、次の式が示すように、SpEL 式はチャネル名に評価される場合があります。

<int:router input-channel="inChannel" expression="payload + 'Channel'"/>

上記の構成では、結果チャネルは SpEL 式によって計算され、payload の値をリテラル String の "Channel" と連結します。

ルーターを構成するための SpEL のもう 1 つの長所は、式が Collection を返すことができ、事実上すべての <router> を受信者リストルーターにすることです。式が複数のチャネル値を返すたびに、メッセージは各チャネルに転送されます。次の例は、そのような式を示しています。

<int:router input-channel="inChannel" expression="headers.channels"/>

上記の構成で、メッセージに "channels" という名前のヘッダーが含まれ、そのヘッダーの値がチャネル名の List である場合、メッセージはリスト内の各チャネルに送信されます。また、複数のチャネルを選択する必要がある場合に、コレクションの射影式とコレクションの選択式が役立つ場合があります。詳細については、以下を参照してください。