Shrio问题转载 先存

目的地:http://blog.csdn.net/wuxuyang_7788/article/details/70141812


[java]  view plain  copy
  1.   
Spring boot 整合shiro 使用yml配置文件
    最近自己玩一下springBoot配置 然后整合一下常用的框架,遇到一个问题。配置LifecycleBeanPostProcessorBean 的时候总是先于spring 读取yml文件。导致配置失败
	@Bean(name = "shiroEhcacheManager")
	public EhCacheManager getEhCacheManager() {
    	    EhCacheManager em = new EhCacheManager();
    	    em.setCacheManagerConfigFile(cacheManagerConfigFilePath);
    	    return em;
	}
Error initializing bean [shiroEhcacheManager]; nested exception is org.apache.shiro.cache.CacheException: 
java.lang.NullPointerException
很显然报出了一个空指针的错误,也就是 cacheManagerConfigFilePath 的值没有初始化成功,我原先以为我的yml文件配置错误,
回去检查了没问题,
于是我开始一个一个Bean 进行初始化,下面是我整个config的配置
[java]  view plain  copy
  1. @Configuration  
  2. @ConfigurationProperties(prefix = "shiro")  
  3. public class ShiroConfiguration {  
  4.   
  5.     private String cacheManagerConfigFilePath;  
  6.     private String loginUrl;  
  7.     private String successUrl;  
  8.   
  9.     private Map filterChainDefinitionMap = new LinkedHashMap();  
  10.   
  11.     @Bean(name = "shiroRealm")  
  12.     public ShiroRealm getShiroRealm() {  
  13.         return new ShiroRealm();  
  14.     }  
  15.   
  16.     @Bean(name = "shiroEhcacheManager")  
  17.     public EhCacheManager getEhCacheManager() {  
  18.         EhCacheManager em = new EhCacheManager();  
  19.         em.setCacheManagerConfigFile(cacheManagerConfigFilePath);  
  20.         return em;  
  21.     }  
  22.   
  23.     @Bean(name = "lifecycleBeanPostProcessor")  
  24.     public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {  
  25.         return new LifecycleBeanPostProcessor();  
  26.     }  
  27.   
  28.     @Bean  
  29.     public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {  
  30.         DefaultAdvisorAutoProxyCreator daap = new DefaultAdvisorAutoProxyCreator();  
  31.         daap.setProxyTargetClass(true);  
  32.         return daap;  
  33.     }  
  34.   
  35.     @Bean(name = "securityManager")  
  36.     public DefaultWebSecurityManager getDefaultWebSecurityManager(AuthorizingRealm shiroRealm,EhCacheManager ehCacheManager) {  
  37.         DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager();  
  38.         dwsm.setRealm(shiroRealm);  
  39.         dwsm.setCacheManager(ehCacheManager);  
  40.         return dwsm;  
  41.     }  
  42.   
  43.     @Bean  
  44.     public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor(SecurityManager securityManager) {  
  45.         AuthorizationAttributeSourceAdvisor aasa = new AuthorizationAttributeSourceAdvisor();  
  46.         aasa.setSecurityManager(securityManager);  
  47.         return new AuthorizationAttributeSourceAdvisor();  
  48.     }  
  49.   
  50.     @Bean(name = "shiroFilter")  
  51.     public ShiroFilterFactoryBean getShiroFilterFactoryBean(SecurityManager securityManager) {  
  52.         ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();  
  53.         shiroFilterFactoryBean  
  54.                 .setSecurityManager(securityManager);  
  55.         shiroFilterFactoryBean.setLoginUrl(loginUrl);  
  56.         shiroFilterFactoryBean.setSuccessUrl(successUrl);  
  57.         //filterChainDefinitionMap.put("/sa/**", "authc");  
  58.         //filterChainDefinitionMap.put("/**", "anon");  
  59.         System.out.println(filterChainDefinitionMap);  
  60.         shiroFilterFactoryBean  
  61.                 .setFilterChainDefinitionMap(filterChainDefinitionMap);  
  62.         return shiroFilterFactoryBean;  
  63.     }  
  64.   
  65.     public String getCacheManagerConfigFilePath() {  
  66.         return cacheManagerConfigFilePath;  
  67.     }  
  68.   
  69.     public void setCacheManagerConfigFilePath(String cacheManagerConfigFilePath) {  
  70.         this.cacheManagerConfigFilePath = cacheManagerConfigFilePath;  
  71.     }  
  72.   
  73.     public String getLoginUrl() {  
  74.         return loginUrl;  
  75.     }  
  76.   
  77.     public void setLoginUrl(String loginUrl) {  
  78.         this.loginUrl = loginUrl;  
  79.     }  
  80.   
  81.     public String getSuccessUrl() {  
  82.         return successUrl;  
  83.     }  
  84.   
  85.     public void setSuccessUrl(String successUrl) {  
  86.         this.successUrl = successUrl;  
  87.     }  
  88.   
  89.     public  Map getFilterChainDefinitionMap() {  
  90.         return filterChainDefinitionMap;  
  91.     }  
  92.   
  93.     public  void setFilterChainDefinitionMap(Map filterChainDefinitionMap) {  
  94.         this.filterChainDefinitionMap = filterChainDefinitionMap;  
  95.     }  
  96. }  
如果我注释掉shiroEhcacheManager 以下所有bean的创建,项目能启动,当我@Bean(name = "lifecycleBeanPostProcessor")
创建这个bean的时候就抛出了上面的异常。这么分析过来问题应该出在这个bean上。
百度了一下,
LifecycleBeanPostProcessor用于在实现了Initializable接口的Shiro bean初始化时调用Initializable接口回调,在实现了Destroyable接口的
Shiro bean销毁时调用 Destroyable接口回调。
而我在创建的EhCacheManager 正是实现了Initializable接口,下面我截图了一张官方的在配置上面的说明
BeanFactoryPostProcessor的时候(LifecycleBeanPostProcessor正是BeanPostProcessor 的子类)。应该讲这些创建Bean的方法前面加上static。让使用configuration的类在没有实例化的时候不会去过早的要求@Autowired和@Value
进行注入。
最后解决问题很简单,只要在创建LifecycleBeanPostProcessor的方法变为静态static方法。
其实我也没有彻底弄清楚出现这个问题的根本原因,如果有其他人知道的话,请指出来共同学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值