java - Spring Boot - 环境@Autowired 抛出 NullPointerException

标签 java spring-boot nullpointerexception autowired environment

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

在其中一个配置文件中,我正在尝试 @Autowire Environment,但由于 NullPointerException 而失败。

这是我目前所拥有的:

应用程序.java

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

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

对于属性文件,我以这种方式配置了 PropertySourcesPlaceholderConfigurer:

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

我已经尝试交换 @Autowired@Resource@Inject,但到目前为止没有任何效果。将不胜感激任何帮助。谢谢。

最佳答案

虽然您的特定问题已解决,这里是获取环境的方法,以防 Spring 的 Autowiring 发生得太晚

诀窍是实现org.springframework.context.EnvironmentAware;然后 Spring 将环境传递给 setEnvironment() 方法。 这从 Spring 3.1 开始有效。

一个例子:

@Configuration
@PropertySource("classpath:myProperties.properties")
public class MyConfiguration implements EnvironmentAware {

    private Environment environment;

    @Override
    public void setEnvironment(final Environment environment) {
        this.environment = environment;
    }

    public void myMethod() {
        final String myPropertyValue = environment.getProperty("myProperty");
        // ...
    }

}

这不像 @Autowired@Value 那样优雅,但在某些情况下它可以作为解决方法。

关于java - Spring Boot - 环境@Autowired 抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19454289/

相关文章:

java - 如何在 GWT 应用程序中显示一种格式?

java - JDBC - 在准备好的语句中使用 sysdate 会产生错误

java - 将 null 添加到空 TreeSet 引发 NullPointerException

java - 调用 moveToFirst() 时光标抛出 NullPointerException

java - Netbeans Maven 项目在 Windows 中运行,但在 Linux 中不运行

java - Activity 的成员范围和 Asynctask

java - Eclipse 中的 SOAP 消息不跟踪

java - Spring Hibernate 模式更新不适用于数据库名称中的减号

java - Spring测试抛出ResourceAccessException

spring-security - 带表单登录的 Spring Boot Security OAuth2