小编典典

Spring Boot-环境@Autowired抛出NullPointerException

spring-boot

我有一个使用 Spring Boot 0.5.0.M5 的项目设置。

在我尝试@Autowire Environment使用的一个配置文件中,但失败了NullPointerException

这是我到目前为止的内容:

应用程序

@EnableAutoConfiguration
@Configuration
@ComponentScan
public class Application {

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

*我正在尝试的 *JpaConfig.java@Autowire Environment

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.ui.persistence.repository")
public class JpaConfig {
    private static final String DATABASE_DRIVER = "db.driver";
    private static final String DATABASE_PASSWORD = "db.password";
    private static final String DATABASE_URL = "db.url";
    private static final String DATABASE_USERNAME = "db.username";
    private static final String HIBERNATE_DIALECT = "hibernate.dialect";
    private static final String HIBERNATE_SHOW_SQL = "hibernate.show_sql";
    private static final String ENTITYMANAGER_PACKAGES_TO_SCAN 
        = "entitymanager.packages.to.scan";

    @Autowired
    private Environment env;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty(DATABASE_DRIVER));
        dataSource.setUrl(env.getProperty(DATABASE_URL));
        dataSource.setUsername(env.getProperty(DATABASE_USERNAME));
        dataSource.setPassword(env.getProperty(DATABASE_PASSWORD));
        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean 
                = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource());
        entityManagerFactoryBean.setPersistenceProviderClass(
                HibernatePersistence.class);
        entityManagerFactoryBean.setPackagesToScan(
                env.getProperty(ENTITYMANAGER_PACKAGES_TO_SCAN));
        entityManagerFactoryBean.setJpaProperties(hibernateProperties());
        return entityManagerFactoryBean;
    }
}

我正在尝试加载在属性文件中配置的数据库属性。但是,Environment不会注入,并且代码将失败NullPointerException。我在XML文件中没有任何配置。

对于属性文件,我已通过PropertySourcesPlaceholderConfigurer以下方式配置:

@Configuration
@PropertySource("classpath:database.properties")
public class PropertyConfig {
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyPlaceHolderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

我试图交换@Autowired@Resource并且@Inject但至今没有奏效。将不胜感激。谢谢。


阅读 673

收藏
2020-05-30

共1个答案

小编典典

我相信Spring和EntityManagerFactory会存在一些生命周期问题,并且您可能已经犯了这些问题(已在4.0.0.RC1中修复)-如果您的@Configuration类在早期被实例化,则可能不符合自动装配的条件。您可能会从日志输出中得知是否是这种情况。

只是出于兴趣,您是否知道您使用JpaConfig和提供的功能(PropertyConfig如果您使用的是已定义好的,@EnableAutoConfiguration只要您@ComponentScan定义了存储库的那个包)?

2020-05-30