【发布时间】:2015-12-11 07:11:50
【问题描述】:
我想在UserService(具体类)的save()方法中使用@Transactional注解如下:
@Service
public class UserService {
@Transactional
public Long save(User userCommand, BindingResult result) {
...
}
}
我将通过自动装配在 MyRealm 中使用此服务。
public class MyRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
}
但是,它失败并出现以下错误:
java.lang.IllegalArgumentException: Can not set n.r.c.s.user.UserService field n.r.c.s.realm.MyRealm.userService to com.sun.proxy.$Proxy48
当然,如果我删除 @Transational 注释,它会起作用。
我的事务管理器设置如下:
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
请告诉我我的代码有什么问题?
我需要设置代理之类的东西吗?
【问题讨论】:
-
我想,MyRealm 或 AuthorizingReal 是 spring bean 吗?您是否打算在事务管理器中使用 mode=aspectj
-
将此行添加到您的 spring-conf
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="false" />,但您仍然确定 MyRealm 是上下文感知的吗? -
那是你的实际
UserService还是你在上面定义了一些接口? -
@Koitoer,MyRealm 具有“组件”注释,以便将“自动装配”作为 Spring bean 启用。
-
@AntJavaDev 我把你提到的选项,但它没有任何区别。我仍然很困惑。 :(
标签: spring jpa proxy-classes