2010-11-04 2 views
1

почему я всегда получаю userDetailDao исключения нуля при выполнении:не удался autowired аннотации

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

Я думаю, ваш UserDetailDao объявлен в DispatcherServlet и поэтому недоступен в корневом контексте webapp, где объявляется userService. Итак, UserDetailsDao должен быть объявлен как компонент в корневом контексте.

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

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

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