【发布时间】:2014-01-18 08:36:55
【问题描述】:
我在自动装配的属性中遇到了空值。我希望我能得到一些帮助。
我们正在为项目使用 spring-boot 版本 0.5.0.M6。
四个带bean的配置文件在一个包中,按“面积”排序:
- 数据源配置
- 全局方法安全配置(我们使用 Spring-ACL)
- MVC 配置
- Spring 安全配置
引导一切的主要方法在以下文件中:
@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,但它在第一个使用数据源的 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 为空。我们已经尝试通过实现Ordered 接口来订购配置文件。我们也尝试使用@AutoConfigureAfter(RootDataSourceConfig.class),但这也无济于事。除了在DataSource 上执行@Autowired 之外,我们还尝试注入RootDataSourceConfig 类本身,但它仍然为空。我们尝试在这些 bean 上使用 @DependsOn 和 @Ordered,但同样没有成功。似乎无法将任何内容注入此配置。
启动时的控制台输出会按照我们想要的顺序列出 bean,其中数据源是第一个。我们几乎被这个阻止了。
我们在这里做的任何奇怪或独特的事情都不起作用吗?如果这是设计的,那我们怎么能以不同的方式注入数据源呢?
回购:github
【问题讨论】:
-
可能有一些我们没有看到的代码会强制提前实例化您的
RootGlobalMethodSecurityConfig。您能否分享整个项目(例如在 github 上)?这样就更容易看到全貌了。 -
一些一般性观察: 1) 大多数
@Order和@DependsOn声明可能是不必要的——Spring 足够聪明,可以在大多数情况下解决依赖关系。 2)@EnableAspectJAutoProxy是多余的。 3) 自动配置声明中的所有排除项也可能是多余的,它们肯定会分散注意力。 4)@AutoConfigureAfter仅适用于自动配置类,而你的(我假设)是普通的组件 bean。 -
Dave,我已经将项目推送到 github:link.
-
@DaveSyer 项目以
spring-boot 0.5.0.M5启动,没有任何错误。由于 M5 使用spring 4.0.0.M3,我尝试运行spring-boot 0.5.0.M6 + spring 4.0.0.M3,但启动失败。但使用spring-boot 0.5.0.M5 + spring 4.0.0.RELEASE运行正常。 -
您可以尝试 M7(还有快照)。可能值得一试(我可以看看你的项目到明天)。
标签: java spring-boot configuration nullpointerexception autowired