shiro导致springboot事务不起效的原因是shiro在启动配置的时候Spring还没启动,
解决办法:把原来在 ShiroConfig里面初始化的 getUserRealm() 和securityManager()方法移动到一个新建的spring监听器中去初始化
@Configuration
public class ShiroConfig {
@Bean
public UserRealm getUserRealm(){UserRealm userRealm = new UserRealm();
return userRealm;
}
@Bean
public SecurityManager securityManager(){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(getUserRealm());
return securityManager;
}
....
}
新建spring监听器
@Component
public class SpringEventListener {
@Bean("authorityRealm")
public UserRealm getUserRealm(){
UserRealm userRealm = new UserRealm();
return userRealm;
}
@Bean("securityManager")
public SecurityManager securityManager(){
DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
manager.setRealm(getUserRealm());
manager.setCacheManager(new MemoryConstrainedCacheManager());
return manager;
}
@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);
}
}
即可解决