プロキシ @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) {
...
}
}