【发布时间】:2014-08-10 16:03:24
【问题描述】:
尝试在我的 SecurityConfig Java Config 类中自动装配自定义 UserDetailsService 实现时,我得到了java.lang.IllegalArgumentException: A UserDetailsService must be set。这是我的配置类的概述。
根配置
@Configuration
@Import(value = { SecurityConfig.class, ServiceConfig.class })
public class RootConfig
{
}
服务配置
@Configuration
@ComponentScan(value = "basepackage.service")
// this package includes the custom UserDetailsService implementation
// annotated by @Service
public class ServiceConfig
{
}
安全配置
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends GlobalMethodSecurityConfiguration
{
// this service is injected using setter injection, omitted for clarity
private UserDetailsService userDetailsService;
@Autowired
public void registerGlobal(AuthenticationManagerBuilder auth)
throws Exception
{
auth.userDetailsService(userDetailsService);
}
}
现在,问题是:有时(但只是有时 - 它似乎完全随机)自定义 UserDetailsService 在 methodSecurityInterceptor 实例化之前不会自动装配,我得到 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'methodSecurityInterceptor' defined in class basepackage.SecurityConfig... 并且堆栈结束于
Caused by: java.lang.IllegalArgumentException: A UserDetailsService must be set
at org.springframework.util.Assert.notNull(Assert.java:112)
at org.springframework.security.authentication.dao.DaoAuthenticationProvider.doAfterPropertiesSet(DaoAuthenticationProvider.java:94)
正如我之前提到的,UserDetailsService 实现使用@Service 注释进行注释,并且应该由ServiceConfig 以正确的顺序实例化。此问题仅在部署应用程序时不时发生。通常一切都正确实例化。当我使用 @Bean 注释在 SecurityConfig 内创建 UserDetailsService bean 时,一切都很好。但我更喜欢将服务 bean 与SecurityConfig 分开。我尝试使用 @Order 注释进行试验,但没有成功。
任何想法为什么会发生这种情况?另外,为什么它是随机发生的,而不是每次都发生?为什么 Spring 不能以正确的顺序实例化 bean?非常感谢您的帮助。
【问题讨论】:
-
@Karthikeyan 你显然没有阅读我的问题......我不会问这么简单的事情。
标签: java spring spring-security autowired spring-java-config