shiro框架,自定义realm注入service失败解决办法

时间:2024-03-29 21:56:13

最近在学习使用shiro框架,按照网上的方法照葫芦画瓢去配置,结果出现了问题.

其中最为严重的就是 自定义的realm在引用service时,自动注入失败.

shiro框架,自定义realm注入service失败解决办法

报错如下:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'shiroFilter' defined in ServletContext resource [/WEB-INF/config/spring-shrio.xml]: Cannot resolve reference to bean 'securityManager' while setting bean property 'securityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'securityManager' defined in ServletContext resource [/WEB-INF/config/spring-shrio.xml]: Cannot resolve reference to bean 'databaseRealm' while setting bean property 'realm'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'databaseRealm': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.blog.service.ILoginService com.blog.realm.DatabaseRealm.loginSerivce; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.blog.service.ILoginService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
这一大堆英文看着都懵,总而言之,言而总之一句话,自动注入失败

问题分析: 查阅网络上大量的问题分析,得到结论shiro 自定义realm的认证阶段属于filter,当时的spring bean还没有读取进来。

解决方案就是: 在执行读取shiro配置文件中的filter之前,要先去把注册的bean执行了.

那谁会去注册bean呢. 就是spring-mvc的xml中的

<!-- 自动扫描的包名 ,使Spring支持自动检测组件,如注解的Controller-->
    <context:component-scan base-package="com.blog.controller" />
    <context:component-scan base-package="com.blog.service"/>
	<context:component-scan base-package="com.blog.realm"/>

因此 

你可以在执行shiro的xml之前先执行一遍spring-mvc的xml,这样就可以先注册bean了.但是有个问题,之后你还是要再一次执行spring-mvc.xml,执行了两次,会不会出现问题呢,不好说啊

也可以这样做

shiro框架,自定义realm注入service失败解决办法

在shiro的xml中 把这个语句加上,也就是说注册扫描service包在shiro的xml执行,

这样一来,realm中的service就可以注入成功了