跳到主要内容

代理 @RabbitListener 和泛型

DeepSeek V3 中英对照 Proxy @RabbitListener and Generics Proxy @RabbitListener and Generics

如果你的服务打算被代理(例如,在使用 @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) {
...
}

}
java

在使用一个通用接口和特定实现时,由于接口 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) {
...
}

}
java