[英]Spring Boot app is not able to read environment properties
我有一个 Spring 引导应用程序,我在其中使用yml
文件的环境属性。
我的application.yml
看起来像这样:
spring:
datasource:
url: ${DB_URL}
driver-class-name: ${DB_DRIVER}
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
connectionTestQuery: SELECT 1 FROM DUAL
max-wait: ${database.max-wait:5000}
max-active: ${database.max-active:500}
test-on-borrow: ${database.test-on-borrow:true}
initialization-mode: always
当我尝试通过 Tomcat 将其部署到外部主机时,应用程序无法启动,因为它无法读取环境变量。 我收到以下错误
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker': Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.init.UncategorizedScriptException: Failed to execute database script; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Access denied for user '${DB_USERNAME}'@'localhost' (using password: YES)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1794)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:227)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1175)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:420)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:350)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:343)
at org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerPostProcessor.postProcessAfterInitialization(DataSourceInitializerPostProcessor.java:52)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:430)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1798)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)
... 134 more
我正在使用 Ubuntu 服务器。 我在/etc/environment
上设置了环境变量,它们看起来像这样
DB_URL="jdbc:mysql://XX.XX.XX.XX:3306/XXXXX"
DB_USER="XXXXX"
DB_PASSWORD="XXXXX"
DB_DRIVER="com.mysql.cj.jdbc.Driver"
当我运行命令set
时,它们会完美地显示在那里。 我还尝试在/opt/tomcat/bin
下创建一个setenv.sh
文件,如下所示:
#!/bin/bash
export DB_DRIVER=com.mysql.cj.jdbc.Driver
export DB_PASSWORD=XXXXXX
export DB_URL=jdbc:mysql://XX.XX.XX.XX:3306/XXXXX
export DB_USER=XXXXXX
我没有尝试在个人资料中这样做,因为根据这个线程, /etc/environment
应该足够了: https://unix.stackexchange.com/questions/117467/how-to-permanently-set-environmental-variables
知道我可能会遗漏什么吗?
可能是您输入了错误的凭据。 只需使用一些 MySql GUI 工具(如 workbench、sqlyog...)交叉检查相同的凭证。
您可以使用spring.config.location
为外部化配置文件设置显式路径。 然后您可以配置您的 Spring Boot 应用程序以在启动时将它们加载为系统属性。
例如
Properties props = new Properties();
props.setProperty("spring.config.location",<your config file path>);
资料来源: 这里
在您正在使用的 spring 引导属性文件中
${DB_USERNAME}
在您正在使用的 bash 配置文件中
导出 DB_USER=XXXXXX
将 bash 文件更改为
导出 ${DB_USERNAME}=XXXXXX
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.