无法自动装配注释

时间:2010-11-04 17:06:33

标签: spring annotations autowired

为什么我总是在执行时得到userDetailDao异常为null:

package com.springweb.service;

import com.springweb.dao.UserDetailDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.dao.DataAccessException;
import org.springframework.security.userdetails.UserDetails;
import org.springframework.security.userdetails.UserDetailsService;
import org.springframework.security.userdetails.UsernameNotFoundException;

public class UserService implements UserDetailsService
{    
    @Autowired
    UserDetailDao userDetailDao;

    public UserDetails loadUserByUsername(String string) throws UsernameNotFoundException, DataAccessException {
        return userDetailDao.queryForUser(string);
    }

}

在我的春季安全配置中:

<security:authentication-provider user-service-ref="userService">
    <security:password-encoder hash="md5" />        
</security:authentication-provider>

<bean name="userService" class="com.springweb.service.UserService">
</bean>

在我的调度程序上下文中,我已经定义了扫描包:

<context:component-scan base-package="com.springweb"/>

1 个答案:

答案 0 :(得分:4)

我猜你的UserDetailDao是在DispatcherServlet上下文中声明的,因此无法在声明userService的根webapp上下文中访问。因此,UserDetailsDao应该在根上下文中声明为bean。

您还需要在根上下文中使用<context:annotation-driven/>

一般来说,你现在有一个重复的bean - 通过DispatcherServlet将bean添加到<context:component-scan>上下文中,并在根上下文中手动声明相同类的bean。应该避免这种情况 - 您需要更仔细地指定要由<context:component-scan>扫描的包。

另见: