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