spring 自动装配因@Transactional 失败
spring autowiring fails with @Transactional
我想在UserService(具体class)的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" />
请让我知道我的代码有什么问题?
我需要设置代理之类的东西吗?
启用代理后,您需要使用接口,而不是实现。
@Service
public class UserService implements SomeInterface {
@Transactional
public Long save(User userCommand, BindingResult result) {
...
}
}
public class MyRealm extends AuthorizingRealm {
@Autowired
private SomeInterface userService;
}
如果您不想这样做,您可以随时检查您的 AOP 配置。您可能正在某处代理代理。
我想在UserService(具体class)的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" />
请让我知道我的代码有什么问题?
我需要设置代理之类的东西吗?
启用代理后,您需要使用接口,而不是实现。
@Service
public class UserService implements SomeInterface {
@Transactional
public Long save(User userCommand, BindingResult result) {
...
}
}
public class MyRealm extends AuthorizingRealm {
@Autowired
private SomeInterface userService;
}
如果您不想这样做,您可以随时检查您的 AOP 配置。您可能正在某处代理代理。