プロキシ @RabbitListener とジェネリクス

サービスがプロキシされることを意図している場合 (たとえば、@Transactional の場合)、インターフェースにジェネリクスパラメーターがある場合は、いくつかの考慮事項に留意する必要があります。次の例を検討してください。

interface TxService<P> {

   String handle(P payload, String header);

}

static class TxServiceImpl implements TxService<Foo> {

    @Override
    @RabbitListener(...)
    public String handle(Thing thing, String rk) {
         ...
    }

}

汎用インターフェースと特定の実装では、インターフェース handle メソッドの実際の実装はブリッジメソッドであるため、CGLIB ターゲットクラスプロキシに切り替える必要があります。トランザクション管理の場合、CGLIB の使用はアノテーションオプション @EnableTransactionManagement(proxyTargetClass = true) を使用して構成されます。この場合、次の例に示すように、実装のターゲットメソッドですべてのアノテーションを宣言する必要があります。

static class TxServiceImpl implements TxService<Foo> {

    @Override
    @Transactional
    @RabbitListener(...)
    public String handle(@Payload Foo foo, @Header("amqp_receivedRoutingKey") String rk) {
        ...
    }

}