为什么我总是在执行时得到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"/>
答案 0 :(得分:4)
我猜你的UserDetailDao
是在DispatcherServlet
上下文中声明的,因此无法在声明userService
的根webapp上下文中访问。因此,UserDetailsDao
应该在根上下文中声明为bean。
您还需要在根上下文中使用<context:annotation-driven/>
。
一般来说,你现在有一个重复的bean - 通过DispatcherServlet
将bean添加到<context:component-scan>
上下文中,并在根上下文中手动声明相同类的bean。应该避免这种情况 - 您需要更仔细地指定要由<context:component-scan>
扫描的包。
另见: