не удалось авто-аннотации - PullRequest
1 голос
/ 04 ноября 2010

почему я всегда получаю исключение 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);
    }

}

в моей конфигурации безопасности Spring:

<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 Ответ

4 голосов
/ 04 ноября 2010

Полагаю, ваш UserDetailDao объявлен в контексте DispatcherServlet и поэтому недоступен в контексте корневого веб-приложения, где объявлено userService. Таким образом, UserDetailsDao должен быть объявлен как bean-компонент в корневом контексте.

Также вам нужно <context:annotation-driven/> в корневом контексте.

Вообще говоря, теперь у вас есть дублирование bean-компонентов: bean-компоненты добавляются в DispatcherServlet -конструктором <context:component-scan>, и bean-компоненты тех же классов вручную объявляются в корневом контексте. Эту ситуацию следует избегать - вам нужно указать пакеты, которые будут проверяться <context:component-scan> более тщательно.

Смотри также:

...