2014-08-27 1 views
3

저는 Spring-World의 초보자입니다. Spring Security 및 JPA가있는 Spring Boot 응용 프로그램이 있습니다. 또한 CrudRepository와 UserDetailsService도 있고,UserDetailsService에 Autowired CrudRepository가 항상 null입니다.

@Repository 
public interface UserDao extends CrudRepository<User, Long> { 
    public Collection<User> findByName(String name); 
} 

ApiUserDetailsService

@Component 
public class ApiUserDetailsService implements UserDetailsService { 

    @Autowired 
    private UserDao dao; 

    @Override 
    public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException { 
     assert dao != null; 
     ... 
    } 
} 
UserDao

Application 클래스

@Configuration 
@ComponentScan 
@EnableAutoConfiguration 
public class Application { 
    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 

아래 참조 6,

보안 구성

@Configuration 
@EnableWebSecurity 
public class HttpBasicAuthConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.csrf().disable(); 
     http.requestCache().requestCache(new NullRequestCache()); 
     http.httpBasic(); 
     http.authorizeRequests().anyRequest().authenticated(); 
    } 


    @Autowired 
    public void registerAuthentication(AuthenticationManagerBuilder auth) throws Exception { 
     auth.userDetailsService(new ApiUserDetailsService()); 
    } 
} 

를 autowire의 DAO는 항상 null 인 이유는 무엇입니까? 내가 뭘 잘못 했니?

+0

한 가지 제안이 구성 요소가 검색되지 않는 것이있을 수 있습니다. @ComponentScan - "은 검사 할 특정 패키지를 정의하도록 지정할 수 있습니다. 특정 * 패키지가 정의되지 않은 경우이 주석이있는 클래스의 패키지에서 검사가 수행됩니다." – birya

+1

"Spring Data'를 사용하고 있습니까?, UserDao는 인터페이스입니다 , 또한 귀하의 registerAuthentication에서 새로운'ApiUserDetailsService'를 생성하고 있습니다. autowired해야합니다. –

+0

[내 Spring @Autowired 필드가 null 인 이유는 무엇입니까?] (http://stackoverflow.com/questions/19896870/why-is-my-spring-autowired-field-null) – chrylis

답변

8

당신은 방법에서 수동으로 ApiUserDetailsService를 만드는 :

@Autowired 
public void registerAuthentication(AuthenticationManagerBuilder auth) throws Exception { 
    auth.userDetailsService(new ApiUserDetailsService()); 
} 

은 당신이 원하는 것은 :

@Configuration 
@EnableWebSecurity 
@EnableJpaRepositories(basePackages = {"your.package.dao"}) 
public class HttpBasicAuthConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.csrf().disable(); 
     http.requestCache().requestCache(new NullRequestCache()); 
     http.httpBasic(); 
     http.authorizeRequests().anyRequest().authenticated(); 
    } 

    // register ApiUserDetailsService as a bean 
    @Bean 
    public UserDetailsService apiUserDetailsService() { 
     return new ApiUserDetailsService();  
    } 

    @Autowired 
    public void registerAuthentication(AuthenticationManagerBuilder auth) throws  Exception { 
     // get the autowired bean from Spring 
     auth.userDetailsService(apiUserDetailsService()); 
    } 
} 
관련 문제