[英]How do I configure a Spring Boot datasource from an external properties file defined in the system environment?
我有一个环境变量“KBL_APP_PROPS”。 这既存在于我们本地的 Windows 环境中,也存在于服务器的 LINUX 环境中。 此环境变量指向系统上的 Properties 文件。
我正在尝试编写一个程序,该程序使用指定的属性文件来配置数据库连接。 我尝试了几件事,下面的代码反映了我当前的演绎。
我的数据库配置类
@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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.