springboot+shiro+mybatis整合發現部分功能事務沒有被spring管理
阿新 • • 發佈:2019-01-26
最近寫一個後臺管理的開源專案,發現報錯事務沒有回滾,折磨了我兩天發現其他功能事務都是好用的,只有關於使用者的那部分事務沒有被spring管理,最後發現在shiro在啟動配置的時候Spring還沒啟動,因為是Shiro先啟動的。
在百度了好久也沒解決辦法,好多都說直接用dao呼叫,還有提高spring啟動的優先順序,這些都試過,沒用!!然後Google發現一個靠譜的解決辦法。
解決辦法:
/** * 宣告SecurityManager * @return */ @Bean(name="securityManager") public SecurityManager securityManager() { DefaultWebSecurityManager manager = new DefaultWebSecurityManager(); //manager.setRealm(authorityRealm); manager.setCacheManager(new MemoryConstrainedCacheManager()); return manager; }
在shiro啟動的時候不設定自己的realm,然後在spring啟動完成後再設定自己的realm。
所以需要寫一個監聽器,在spring初始化完成後設定自己的realm就可以了
@Component public class SpringEventListener { @EventListener public void handleContextRefresh(ContextRefreshedEvent event) { ApplicationContext context = event.getApplicationContext(); DefaultWebSecurityManager manager = (DefaultWebSecurityManager) context.getBean("securityManager"); AuthorizingRealm realm = (AuthorizingRealm) context.getBean("authorityRealm"); realm.setCredentialsMatcher(new CustomCredentialsMatcher()); manager.setRealm(realm); } }
解決辦法,需要翻牆可以訪問