问题描述
最近在项目中遇到,@Service层的@Transactional注解集体失效,修改数据操作会报错:
org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query;
一直没能找到根本原因,在dao层加入@Transactional,临时解决。
错误原因
经过排查,发现在自定义的Realm中,@Autowired注入的Service没有经过Spring代理,因此管理事务失效。
解决方案
1. 增加Spring监听器。缺点: Listener多次被调用。
@Component
public class SpringListener {
@EventListener
public void whenContextRefresh(ContextRefreshedEvent event) {
ApplicationContext context = event.getApplicationContext();
DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager)context.getBean("securityManager");
ShiroRealm shiroRealm = (ShiroRealm)context.getBean("shiroRealm");
securityManager.setRealm(shiroRealm);
}
}
2. Realm中使用dao。缺点: dao中没有逻辑处理。
@Autowired
private UserDao dao;
3. 增加@Lazy注解。 缺点:目前未知。
@Lazy
@Autowired
private UserService service;
参考来自:
https://blog.csdn.net/finalcola/article/details/81197584
https://blog.csdn.net/yucaifu1989/article/details/79206369