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