3
4

1 回答 1

3

这通常是因为当您将 @Transactional 放在一个方法上时,Spring 会为该 bean 创建一个动态代理 - 如果 bean 实现了一个接口,则基于该接口创建动态代理,否则 CGLIB 将用于创建代理。

我猜你的问题是因为你的控制器可能基于某个接口,或者你正在基于基类扩展它。这最终会基于该接口创建一个代理,因为当需要为您的请求创建映射时,Spring MVC 可能无法从您的 bean 中找到您的映射。

修复可能有几个:

一种。您可以尝试强制代理基于 CGLIB 进行交易:

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

湾。您可以使用纯 Aspectj,加载时编织或编译时编织

C。您可以将@Transactional 移动到服务(具有接口)中并将调用从控制器委托给服务,这样可以避免控制器上的@Transaction

于 2012-08-10T12:42:32.820 回答