Spring 注解 通过@Resource获得的是空指针

wanghd 发布于 2014/03/23 00:11
阅读 14K+
收藏 0

Spring+Shiro,使用注解,在定义的MyRealm中使用注解定义的Bean都无法使用,测试了几个service和dao,在其他Controller/Service中都能正常使用,在下面的MyRealm中却失败,研究了一晚上没搞定,纠结万分呐,请大家给看看错在哪儿:

@Component
public class MyRealm extends AuthorizingRealm
{


    //无法使用注解,调用不到bean,如果在方法改用直接new,loginDao中的注解也会失效
    
    @Resource(name="loginDao")
    private LoginDao loginDao;
    public void setLoginDao(LoginDao loginDao)
    {
        this.loginDao = loginDao;
    }


    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0)
    {
        // TODO Auto-generated method stub
        System.out.println("getAuthorization");
        
        return null;
    }


    //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
            AuthenticationToken authcToken) throws AuthenticationException
    {
        // TODO Auto-generated method stub
        System.out.println("登录认证");
        UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
        String username = token.getUsername();
        if(username!=null&&!username.isEmpty())
        {
            LoginModel loginModel = new LoginModel();
            loginModel.setAccount(username);
            loginModel.setPassword(String.valueOf(token.getPassword()));
           
            User user = loginDao.login(loginModel);//报空指针,loginDao==null
            if(user != null)
            {
                return new SimpleAuthenticationInfo(user.getAccount(),user.getPassword(),getName());
                
            }
        }
        return null;
    }

}

spring-shiro.xml:

...

<description>Shiro</description>


<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>


<!-- MyReal 自定义Bean,在.xml中定义myRealm而不是用注解方式定义,是因为一定要在sercurityManager之前定义 -->
<bean id="myRealm" class="com.www.service.MyRealm"></bean>


<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    <property name="realm" ref="myRealm"/>
</bean>


<!-- 接受安全登录检查,如果未登录,则跳转到loginUrl指向的路径;如果成功则转到successUrl指向的路径 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <property name="securityManager" ref="securityManager"/>
    <property name="loginUrl" value="login"/>
    <property name="successUrl" value="index"/>
    <property name="unauthorizedUrl" value="error"/>
    <property name="filterChainDefinitions">
        <value>
        /login.jsp = anon
        /login = anon
        /index.jsp = anon
        /index = anon
        
        /*.jsp = authc
        /*.do = authc
        /** = authc
        </value>
    </property> 
    
</bean>


...


dispatcher-servlet.xml:

<context:annotation-config />
    <context:component-scan base-package="com.www" />
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"></bean>
    
    



加载中
0
平安OSC
平安OSC
你的dao在spring中注入了吗?或者试试@Autowire 呢?
wanghd
wanghd
注解了,dao在Controller里面使用可以用
0
_金角大王_
_金角大王_
请用代码格式化后在发布。。。。
0
_金角大王_
_金角大王_
// JdbcRealm
@Resource(name = "loginService")
private ILoginService loginService;

// spring-shiro.xml
<bean id="jdbcRealm" class="com.secn.login.shiro.JdbcRealm">
    <property name="cacheManager" ref="shiroCacheManager" />
</bean>

// 扫描指定包下的组件
<context:component-scan base-package="com.secn">
    <context:include-filter type="aspectj" expression="com.secn.*.dao"/>
    <context:include-filter type="aspectj" expression="com.secn.*.service.*"/>
</context:component-scan>



_金角大王_
_金角大王_
回复 @wanghd : 扫描指定包下的bean。 我的REALM就在其中。 这样就保证了REALM中的LoginService能够正确的被注入。 我的理解是这样的、
wanghd
wanghd
你还用到aspectj>.....其实问题不在dao有没有被定义为bean,因为在controller中我试过,dao被成功注解,可以用,就在MyRealm中无法用,很怪,别的bean在MyRealm中也没法用
0
_金角大王_
_金角大王_
我的Realm没有定义@Component注解。 你已经在配置文件里面定义了为何还要用@Component?
wanghd
wanghd
我先注解,但在配置文件里配置shiro的时候要用到Realm,需要在用到的地方之前定义MyRealm的bean,就在spring-shiro.xml中提前定义了,不冲突,去掉@Component一样不对
0
alexgaoyh
alexgaoyh
bean的生成交给了spring管理,但是有可能在你用到shiro的时候,bean还没有生成,建议可以从application中获取bean实例。。
0
applesky
applesky

我也遇到了这个问题

参考这个吧 http://blog.csdn.net/windsome/article/details/36017221
返回顶部
顶部