1

为什么我在执行时总是得到 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"/>
4

1 回答 1

4

我猜你UserDetailDao是在DispatcherServlet上下文中声明的,因此在声明的根 webapp 上下文中是不可访问的userService。所以,UserDetailsDao应该在根上下文中声明为一个bean。

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

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

也可以看看:

于 2010-11-04T18:00:16.800 回答