1. 程式人生 > >springboot+shiro+mybatis整合發現部分功能事務沒有被spring管理

springboot+shiro+mybatis整合發現部分功能事務沒有被spring管理

最近寫一個後臺管理的開源專案,發現報錯事務沒有回滾,折磨了我兩天發現其他功能事務都是好用的,只有關於使用者的那部分事務沒有被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);
    }
}

解決辦法,需要翻牆可以訪問