package com.mycompany.myapp.config; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.context.ApplicationContextException; import org.springframework.context.EnvironmentAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import javax.sql.DataSource; import java.net.URI; import java.net.URISyntaxException; @Configuration public class HerokuDatabaseConfiguration implements EnvironmentAware { private final Logger log = LoggerFactory.getLogger(HerokuDatabaseConfiguration.class); private RelaxedPropertyResolver propertyResolver; private Environment environment; @Override public void setEnvironment(Environment environment) { this.environment = environment; this.propertyResolver = new RelaxedPropertyResolver(environment, "spring.datasource."); } @Bean public DataSource dataSource() { log.debug("Configuring Heroku Datasource"); String herokuUrl = propertyResolver.getProperty("heroku-url"); if (herokuUrl != null) { log.info("Using Heroku, parsing their $DATABASE_URL to use it with JDBC"); URI dbUri = null; try { dbUri = new URI(herokuUrl); } catch (URISyntaxException e) { throw new ApplicationContextException("Heroku database connection pool is not configured correctly"); } String username = dbUri.getUserInfo().split(":")[0]; String password = dbUri.getUserInfo().split(":")[1]; String dbUrl = "jdbc:postgresql://" + dbUri.getHost() + ':' + dbUri.getPort() + dbUri.getPath() + "?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory"; HikariConfig config = new HikariConfig(); config.setDataSourceClassName(propertyResolver.getProperty("dataSourceClassName")); config.addDataSourceProperty("url", dbUrl); config.addDataSourceProperty("user", username); config.addDataSourceProperty("password", password); return new HikariDataSource(config); } else { throw new ApplicationContextException("Heroku database URL is not configured, you must set --spring.datasource.heroku-url=$DATABASE_URL"); } } }