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