2014-08-27 84 views
3

我是Spring-World的新手,我有Spring安全和JPA的Spring Boot應用程序。也有CrudRepository和UserDetailsS​​ervice中,見下文自動裝配到UserDetailsS​​ervice的CrudRepository始終爲空

應用類

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

userDAO的

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

ApiUserDetailsS​​ervice

@Component 
public class ApiUserDetailsService implements UserDetailsService { 

    @Autowired 
    private UserDao dao; 

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

安全配置

@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()); 
    } 
} 

爲什麼自動裝配Autowired道總是空?我做錯了什麼?

+0

一個建議可能是您的組件沒有被掃描。 「@ComponentScan - 」可以指定定義特定的軟件包進行掃描,如果沒有定義特定的軟件包,將從包含該註釋的類的包中進行掃描「 – birya 2014-08-27 21:16:34

+1

您正在使用'Spring Data' ?,您的UserDao是一個接口,同樣在你的registerAuthentication中你正在創建一個新的'ApiUserDetailsS​​ervice',你需要自動裝配它! – 2014-08-27 21:48:45

+0

[爲什麼我的Spring @Autowired字段爲空]?(http://stackoverflow.com/questions/19896870/why-is-my-spring-autowired-field-null) – chrylis 2014-08-27 23:28:37

回答

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()); 
    } 
} 
相關問題