java - 如何从系统环境中定义的外部属性文件配置 Spring Boot 数据源?

标签 java database spring-boot

我有一个环境变量“KBL_APP_PROPS”。这个在我们本地的Windows环境和服务器的LINUX环境中都存在。该环境变量指向系统上的属性文件。

我正在尝试编写一个程序,使用指定的属性文件来配置数据库连接。我已经尝试了几种方法,下面的代码反射(reflect)了我当前的表现。

我的数据库配置类

@Configuration
public class DatabaseConfig {
    @Autowired
    Environment env;

    @Bean
    public DataSource getDataSource(@Value("dbUri") String url, @Value("dbUser") String userName, @Value("dbPassword") String password) {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("oracle.jdbc.driver.OracleDriver");
        dataSourceBuilder.url(url);
        dataSourceBuilder.username(userName);
        dataSourceBuilder.password(password);
        return dataSourceBuilder.build();
    }

    @Bean
    public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer(/*@Value("${KBL_APP_PROPS}") String fileName*/) {
        PropertySourcesPlaceholderConfigurer properties = new PropertySourcesPlaceholderConfigurer();
        System.out.println(String.format("Env is null %b", env == null));
        properties.setLocation(new FileSystemResource(env.getProperty("KBL_APP_PROPS")/*fileName*/));
        properties.setIgnoreResourceNotFound(false);
        return properties;
    }

我的主课

@SpringBootApplication
public class ShortageClaimAutoAccept implements CommandLineRunner {

    private static final Logger log = Logger.getLogger(ShortageClaimAutoAccept.class);

    @Autowired
    JdbcTemplate jdbcTemplate;

//  @Autowired
//  ClaimRepository claimRepository;


    public ShortageClaimAutoAccept() {
    }

    private void startShortageClaimAutoAcceptApp() {
            // This block is for accepting claim details and closing claims
            {
//              List<Claim> claims = claimRepository.findByUnclosedDaysSinceFiled(30);
//              for(Claim claim : claims) {
//                  System.out.println(claim.toString());
//              }
            }
            // This block is for emailing publishers about claims that need to be reviewed
            {

            }
    }

    public static void main(String[] args) {
        try {
            SpringApplication.run(ShortageClaimAutoAccept.class, args);
        } catch (Exception ex) {
            log.fatal("uncaught exception in the process: \n", ex);
        }
    }

    @Override
    public void run(String... arg0) throws Exception {
        startShortageClaimAutoAcceptApp();
    }
}

我的程序因空指针异常而退出,因为 env 为空。

最佳答案

@Ralf 的评论帮助我找到了一篇 SO 文章,其中某些事情并未调用 @Autowire。因此,我更改了 DatabaseConfig 以使用 EnvironmentAware。

@Configuration
public class DatabaseConfig implements EnvironmentAware {
    Environment environment;

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

    @Bean
    public DataSource getDataSource(@Value("${dbUri}") String url, @Value("${dbUser}") String userName, @Value("${dbPassword}") String password) {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("oracle.jdbc.driver.OracleDriver");
        dataSourceBuilder.url(url);
        dataSourceBuilder.username(userName);
        dataSourceBuilder.password(password);
        return dataSourceBuilder.build();
    }

    @Bean
    public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        PropertySourcesPlaceholderConfigurer properties = new PropertySourcesPlaceholderConfigurer();
        properties.setLocation(new FileSystemResource(environment.getProperty("KBL_APP_PROPS")));
        properties.setIgnoreResourceNotFound(false);
        return properties;
    }
}

关于java - 如何从系统环境中定义的外部属性文件配置 Spring Boot 数据源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60567291/

相关文章:

java - JPA: "Can' t 写入;表中的重复键”用于一对一关系

sql - 如何优化包含数千个 WHERE 子句的 SQL 查询

java - 使用Hibernate在HSQL数据库(内存中)中创建模式(注解方法)

java - Spring Cloud AWS SQS无法在本地连接到服务端点

java - 如何在Java中计算一组连续数字的平均值、中位数和众数?

java - 使用 Java 连接 Azure Key Vault 时出错

php - 将 laravel 文件迁移到 xampp 服务器时出错

java - Hsql - 如果在 spring boot 应用程序中不存在则创建模式

hibernate - 配置 Jackson 在 Spring Boot 中省略延迟加载属性

java - Coap Example For Observe 在 Eclipse 中不起作用