代理 @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) {
         ...
    }

}

對於泛型介面和特定實現,您被迫切換到 CGLIB 目標類代理,因為介面 handle 方法的實際實現是橋接方法。在事務管理的情況下,CGLIB 的使用是透過使用註解選項配置的:@EnableTransactionManagement(proxyTargetClass = true)。在這種情況下,所有註解都必須在實現的 目標方法上宣告,如下例所示

static class TxServiceImpl implements TxService<Foo> {

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

}
© . This site is unofficial and not affiliated with VMware.