Autowired属性为null-Spring Boot配置
我在自动装配的属性中陷入空值。我希望可以得到一些帮助。
我们正在使用项目Spring-boot版本0.5.0.M6。
带有bean的四个配置文件在一个软件包中,并按“区域”排序:
- 数据源配置
- 全局方法安全性配置(因为我们使用Spring-ACL)
- MVC配置
- Spring Security配置
引导所有内容的主要方法在以下文件中:
@EnableAspectJAutoProxy@EnableSpringConfigured
@EnableAutoConfiguration(exclude = {
DataSourceTransactionManagerAutoConfiguration.class,
HibernateJpaAutoConfiguration.class,
JpaRepositoriesAutoConfiguration.class,
SecurityAutoConfiguration.class,
ThymeleafAutoConfiguration.class,
ErrorMvcAutoConfiguration.class,
MessageSourceAutoConfiguration.class,
WebSocketAutoConfiguration.class
})
@Configuration
@ComponentScan
public class IntegrationsImcApplication {
public static void main(String[] args) throws Exception {
ApplicationContext ctx = SpringApplication.run(
IntegrationsImcApplication.c lass, args);
}
}
包含数据源配置bean的第一个文件如下(我省略了一些方法主体部分以使其更具可读性):
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)@Configuration
public class RootDataSourceConfig
extends TomcatDataSourceConfiguration
implements TransactionManagementConfigurer {
@Override
public DataSource dataSource() {
return jpaDataSource();
}
public PlatformTransactionManager annotationDrivenTransactionManager() {
return jpaTransactionManager();
}
@Bean
public HibernateExceptionTranslator hibernateExceptionTranslator() {
return new HibernateExceptionTranslator();
}
@Bean(name="jpaDataSource")
public DataSource jpaDataSource() {......}
@Bean(name = {"transactionManager","txMgr"})
public JpaTransactionManager jpaTransactionManager() {......}
@Bean(name = "entityManagerFactory")
public EntityManagerFactory jpaEmf() {......}
}
这是下一个配置文件,该文件取决于上方的数据源。它有大约20个与ACL配置相关的bean,但是在使用数据源的firsts bean上失败了:
@EnableGlobalMethodSecurity(prePostEnabled = true)@Configuration
public class RootGlobalMethodSecurityConfig
extends GlobalMethodSecurityConfiguration
implements Ordered {
@Autowired
public DataSource dataSource;
@Override
public int getOrder() {
return IntegrationsImcApplication.ROOT_METHOD_SECURITY_CO NFIG_ORDER;
}
@Bean
public MutableAclService aclService()
throws CacheException, IOException {
MutableJdbcAclService aclService = new MutableJdbcAclService(
dataSource, aclLookupStrategy(), aclCache());
aclService.setClassIdentityQuery("SELECT @@IDENTITY");
aclService.setSidIdentityQuery("SELECT @@IDENTITY");
return aclService;
}
...................................
}
基本上,调用aclService()
会引发错误,因为它dataSource
为null。我们已经尝试通过实现Ordered
接口来订购配置文件。我们也尝试使用,@AutoConfigureAfter(RootDataSourceConfig.class)
但这也无济于事。除了尝试做之外@Autowired
,DataSource
我们还尝试注入RootDataSourceConfig
类本身,但是它仍然为null。我们尝试在这些bean上使用@DependsOn
和@Ordered
,但再次没有成功。似乎没有任何东西可以注入此配置。
启动时的控制台输出将按我们想要的顺序列出bean,其中数据源是第一个。我们为此受到了很大的阻碍。
我们在这里所做的任何奇怪或独特的事情都不起作用吗?如果这是设计的,那么我们如何才能不同地注入数据源?
回购:github
回答:
依赖于a的bean的较早初始化DataSource
绝对是问题所在。根本原因与Spring
Boot或自动配置无关,而是通过一个由包裹您的业务bean的方面来应用简单的老式鸡和蛋方法安全性BeanPostProcessor
。一个bean只能发表一些初始化处理
非常
早。在这种情况下,进行DataSource
注入还为时过早(实际上,实例化@Configuration
需要的类DataSource
为时过早,无法正确包装在@Configuration
加工机械中,因此无法自动接线)。我的建议(只会使您与缺少相同之处AuthenticationManager
)是将声明GlobalMethodSecurityConfiguration
为嵌套类,而不是将其声明为嵌套类。DataSource
在以下位置需要:
@EnableGlobalMethodSecurity(prePostEnabled = true)@Configuration
protected static class ActualMethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {
@Autowired
@Qualifier("aclDaoAuthenticationProvider")
private AuthenticationProvider aclDaoAuthenticationProvider;
@Autowired
@Qualifier("aclAnonymousAuthenticationProvider")
private AnonymousAuthenticationProvider aclAnonymousAuthenticationProvider;
@Autowired
@Qualifier("aclExpressionHandler")
private MethodSecurityExpressionHandler aclExpressionHandler;
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
auth.authenticationProvider(aclDaoAuthenticationProvider);
auth.authenticationProvider(aclAnonymousAuthenticationProvider);
}
@Override
public MethodSecurityExpressionHandler createExpressionHandler() {
return aclExpressionHandler;
}
}
也就是说RootMethodSecurityConfiguration
,将其粘贴到并@EnableGlobalMethodSecurity
从该类中删除注释。
以上是 Autowired属性为null-Spring Boot配置 的全部内容, 来源链接: utcz.com/qa/418176.html