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