【问题标题】:How to use Heroku config vars in application.properties file of a Spring Boot Application?如何在 Spring Boot 应用程序的 application.properties 文件中使用 Heroku 配置变量?
【发布时间】:2020-05-05 15:33:37
【问题描述】:

我无法使用在 Spring Boot 应用程序中设置的配置变量。如果在 application.properties 上硬编码我的数据库凭据,一切正常,但是当我尝试从配置变量中获取变量时它无法检测到变量。

我的 application.properties 文件:

spring.datasource.hikari.connection-timeout=20000
spring.datasource.hikari.maximum-pool-size=5

spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=${SPRING_DATASOURCE_URL}
spring.datasource.username=my_username
spring.datasource.password=my_password

spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto=update

heroku config 命令的结果:

=== danef-dictionary-api Config Vars
DATABASE_URL:          postgres://my_username:my_password@host_name:port/db_name
PAPERTRAIL_API_TOKEN:  papertrail_api_token
SPRING_DATASOURCE_URL: jdbc:postgresql://host_name:port/db_name

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>net.danef</groupId>
    <artifactId>danef-dictionary-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>danef-dictionary-api</name>
    <description>Danef Dictionary API</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.0.1</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

heroku local web的结果:

2:12:45 PM web.1 |    .   ____          _            __ _ _
2:12:45 PM web.1 |   /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
2:12:45 PM web.1 |  ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
2:12:45 PM web.1 |   \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
2:12:45 PM web.1 |    '  |____| .__|_| |_|_| |_\__, | / / / /
2:12:45 PM web.1 |   =========|_|==============|___/=/_/_/_/
2:12:45 PM web.1 |   :: Spring Boot ::        (v2.2.2.RELEASE)
2:12:50 PM web.1 |  2020-01-19 14:12:50.528  WARN 22646 --- [           main] o.s.boot.StartupInfoLogger               : InetAddress.getLocalHost().getHostName() took 5004 milliseconds to respond. Please verify your network configuration (macOS machines may need to add entries to /etc/hosts).
2:12:55 PM web.1 |  2020-01-19 14:12:55.540  INFO 22646 --- [           main] net.danef.DanefDictionaryApiApplication  : Starting DanefDictionaryApiApplication on MacBook-Pro.local with PID 22646 (/Users/sametsahin/STS/danef-dictionary-api/target/classes started by sametsahin in /Users/sametsahin/STS/danef-dictionary-api)
2:12:55 PM web.1 |  2020-01-19 14:12:55.543  INFO 22646 --- [           main] net.danef.DanefDictionaryApiApplication  : No active profile set, falling back to default profiles: default
2:12:56 PM web.1 |  2020-01-19 14:12:56.557  INFO 22646 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2:12:56 PM web.1 |  2020-01-19 14:12:56.674  INFO 22646 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 98ms. Found 1 JPA repository interfaces.
2:12:57 PM web.1 |  2020-01-19 14:12:57.252  INFO 22646 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2:12:57 PM web.1 |  2020-01-19 14:12:57.866  INFO 22646 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2:12:57 PM web.1 |  2020-01-19 14:12:57.888  INFO 22646 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2:12:57 PM web.1 |  2020-01-19 14:12:57.889  INFO 22646 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.29]
2:12:58 PM web.1 |  2020-01-19 14:12:58.195  INFO 22646 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2:12:58 PM web.1 |  2020-01-19 14:12:58.195  INFO 22646 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2575 ms
2:12:58 PM web.1 |  2020-01-19 14:12:58.730  INFO 22646 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2:12:58 PM web.1 |  2020-01-19 14:12:58.972  INFO 22646 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.4.9.Final}
2:12:59 PM web.1 |  2020-01-19 14:12:59.226  INFO 22646 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
2:12:59 PM web.1 |  2020-01-19 14:12:59.379  INFO 22646 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2:12:59 PM web.1 |  2020-01-19 14:12:59.385  WARN 22646 --- [           main] o.h.e.j.e.i.JdbcEnvironmentInitiator     : HHH000342: Could not obtain connection to query metadata : Driver org.postgresql.Driver claims to not accept jdbcUrl, ${SPRING_DATASOURCE_URL}
2:12:59 PM web.1 |  2020-01-19 14:12:59.407  INFO 22646 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
2:13:00 PM web.1 |  2020-01-19 14:13:00.368  INFO 22646 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2:13:00 PM web.1 |  2020-01-19 14:13:00.397  WARN 22646 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException:
2:13:00 PM web.1 |  >  [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, ${SPRING_DATASOURCE_URL}
2:13:00 PM web.1 |  2020-01-19 14:13:00.413  INFO 22646 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2:13:00 PM web.1 |  2020-01-19 14:13:00.485  INFO 22646 --- [           main] ConditionEvaluationReportLoggingListener :
2:13:00 PM web.1 |  Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2:13:00 PM web.1 |  2020-01-19 14:13:00.500 ERROR 22646 --- [           main] o.s.boot.SpringApplication               : Application run failed
2:13:00 PM web.1 |  org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, ${SPRIN
2:13:00 PM web.1 |  >  G_DATASOURCE_URL}
2:13:00 PM web.1 |      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1108) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) [spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) [spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) [spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) [spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]
2:13:00 PM web.1 |      at net.danef.DanefDictionaryApiApplication.main(DanefDictionaryApiApplication.java:9) [classes/:na]
2:13:00 PM web.1 |  Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, ${SPRING_DATASOURCE_URL}
2:13:00 PM web.1 |      at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:403) ~[spring-orm-5.2.2.RELEASE.jar:5.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:378) ~[spring-orm-5.2.2.RELEASE.jar:5.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.2.2.RELEASE.jar:5.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]
2:13:00 PM web.1 |      ... 16 common frames omitted
2:13:00 PM web.1 |  Caused by: java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, ${SPRING_DATASOURCE_URL}
2:13:00 PM web.1 |      at com.zaxxer.hikari.util.DriverDataSource.<init>(DriverDataSource.java:110) ~[HikariCP-3.4.1.jar:na]
2:13:00 PM web.1 |      at com.zaxxer.hikari.pool.PoolBase.initializeDataSource(PoolBase.java:320) ~[HikariCP-3.4.1.jar:na]
2:13:00 PM web.1 |      at com.zaxxer.hikari.pool.PoolBase.<init>(PoolBase.java:109) ~[HikariCP-3.4.1.jar:na]
2:13:00 PM web.1 |      at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:108) ~[HikariCP-3.4.1.jar:na]
2:13:00 PM web.1 |      at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-3.4.1.jar:na]
2:13:00 PM web.1 |      at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
2:13:00 PM web.1 |      at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
2:13:00 PM web.1 |      at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:43) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
2:13:00 PM web.1 |      at org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcConnection(ImprovedExtractionContextImpl.java:60) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
2:13:00 PM web.1 |      at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.extractMetadata(SequenceInformationExtractorLegacyImpl.java:40) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
2:13:00 PM web.1 |      at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.initializeSequences(DatabaseInformationImpl.java:65) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
2:13:00 PM web.1 |      at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.<init>(DatabaseInformationImpl.java:59) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
2:13:00 PM web.1 |      at org.hibernate.tool.schema.internal.Helper.buildDatabaseInformation(Helper.java:155) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
2:13:00 PM web.1 |      at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:96) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
2:13:00 PM web.1 |      at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:184) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
2:13:00 PM web.1 |      at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:73) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
2:13:00 PM web.1 |      at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:320) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
2:13:00 PM web.1 |      at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:462) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
2:13:00 PM web.1 |      at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1237) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
2:13:00 PM web.1 |      at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.2.2.RELEASE.jar:5.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.2.2.RELEASE.jar:5.2.2.RELEASE]
2:13:00 PM web.1 |      at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:391) ~[spring-orm-5.2.2.RELEASE.jar:5.2.2.RELEASE]
2:13:00 PM web.1 |      ... 20 common frames omitted
[DONE] Killing all processes with signal  SIGINT
2:13:00 PM web.1 Exited with exit code null

我尝试从 Heroku 网站上的应用程序设置中设置 config vars,但没有任何改变。

【问题讨论】:

    标签: spring-boot heroku


    【解决方案1】:

    你可以使用环境变量:

    public String getPaperTrailApiToken() {
        String token = System.getenv("PAPERTRAIL_API_TOKEN");
    
        if (token == null || token.isEmpty()) {
            // default value (if needed)
            token = "default token";
        }
    
        return token;
    }
    

    如果你想直接在 application.properties 中注入:

    app.token= ${PAPERTRAIL_API_TOKEN}
    

    【讨论】:

    • 不能直接在 application.properties 文件上使用配置变量吗?
    猜你喜欢
    • 2014-12-16
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多