java - 如何从系统环境中定义的外部属性文件配置 Spring Boot 数据源?
问题描述
我有一个环境变量“KBL_APP_PROPS”。这存在于我们本地的 Windows 环境和服务器的 LINUX 环境中。此环境变量指向系统上的属性文件。
我正在尝试编写一个使用指示的属性文件来配置数据库连接的程序。我已经尝试了几件事,下面的代码反映了我当前的版本。
我的数据库配置类
@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;
}
}
推荐阅读
- python - 用于查找阶乘的 Python 代码问题
- scala - 比较匹配器在混合数字类型上失败
- html - 为什么我的 HTML 标记会删除它前面的空格,为什么换行符在这里不起作用?
- python - 在python中调用封闭函数
- computational-geometry - 检查两个平面是否形成同一对象的边界的条件
- python - 如何每隔一行读取 CSV 文件
- javascript - 原型继承如何节省内存?
- mysql - 使用 sequelize,在 where 子句中使用连接表的列值的正确方法是什么?
- java - 通过过滤器将经过身份验证的用户 id 添加到 java servlet
- google-apps-script - 根据单元格中的特定文本输入自动化电子邮件