【问题标题】:spring boot usage of placeholder in application propertiesspring boot 在应用程序属性中使用占位符
【发布时间】:2019-04-15 20:37:30
【问题描述】:

我写了一个简单的 spring boot 应用程序(版本 springboot 2.0),它使用了 mysql(版本 5.7)。

application.properties sn-p

spring.datasource.url = jdbc:mysql://localhost:3306/test?useSSL=false
spring.datasource.username = testuser
spring.datasource.password = testpassword
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

当我在本地运行它时,它工作正常。 如果我想在 docker 中运行这个 spring boot 应用程序,那么我可以更改

spring.datasource.url = jdbc:mysql://mysql-container:3306/test?useSSL=false

mysql-container 使用来自 dockerhub 的 mysql:5.7 映像运行。

但是我想从一些占位符属性文件中更改主机的值。所以这看起来像:

spring.datasource.url = jdbc:mysql://${MYSQL_HOST}:3306/test?useSSL=false

注意:我不确定占位符格式。是 ${MYSQL_HOST} 还是 @MYSQL_HOST@ ?

您可以将此占位符文件命名为 placeholder.propertiesplaceholder.conf.env 或任何名称。该文件的内容应类似于:

MYSQL_HOST=localhost

MYSQL_HOST=some ip address

我可以创建 .env 或 .env.test 或 .env.prod,我可以根据我想要运行应用程序的位置引用该 env 文件。


更新 -

我有两个问题:

  1. 我应该将 placeholder.properties 保存在哪里?是在 /config/ 下还是某个特定目录下?

  2. 如何在 application.properties 中调用占位符?

有人可以推荐吗?

【问题讨论】:

  • 我在 application.properties 中使用了 place Holder,例如 ${environment_prefix} 你可以试试这个它会起作用。
  • 我尝试了 ${MYSQL_HOST},但没有成功。我应该在哪里保存 placeholder.properties 文件?检查更新的描述。
  • 请查看已发布的答案。你的建议肯定有帮助。

标签: mysql docker spring-boot kubernetes


【解决方案1】:

建议:如果您的 #/properties 相对较小,为什么不为每个不同的环境使用不同的 application.properties 文件?

您可以在运行时使用-Dspring.profiles.active=myenv 指定环境。

herehere

PS:

回答您的具体问题:语法为${MYSQL_HOST}

【讨论】:

  • 我没有小的 # 属性,它只是来自实际属性文件的 sn-p。所以使用配置文件不是一种选择。
  • ${MYSQL_HOST} 不起作用。我用 2 个问题更新了描述。看看你能不能提出一些建议。
  • 如果我没有说清楚,我很抱歉。 1) 你有很多选择(上面引用),包括24. Externalized ConfigurationProperties with Spring and Spring Boot。请阅读这些链接;请回复具体问题。 2) 我强烈建议使用 application.properties(用于您的公共属性)AND profile-specific.properties。两个链接都讨论了如何。 3) 如果变量定义正确,${MYSQL_HOST} 应该可以工作。
  • 感谢您的建议。在发布问题之前,我已经通过了这些。我试图检查是否有任何更简单的解决方案。无论如何,谢谢。
  • 我的建议 IS "简单" ...在 Spring Boot 级别。但是您在问题中未能明确说明的是您想在 Kubernetes (Docker 编排)级别配置“配置文件”。 "*.properties/profiles" 是 SpringBoot 的最佳选择; “configmap”是 Kubernetes 的更好方式;很高兴您找到了解决方案,感谢您的分享。
【解决方案2】:

感谢@Raheela Aslam 和@paulsm4 的回答以及更多研究发现了这个问题。

我想要达到的目标:

  1. 在 docker 中部署 springboot 应用程序,然后到 kubernetes。
  2. 我使用 minikube 进行本地测试,想将 minikube ip 传递给数据源 url。

我是如何解决的:

我为 mysql_user、mysql_password、mysql_host 分别创建了配置映射。

kubectl create configmap mysql-config \
--from-literal=mysql_user=testuser \
--from-literal=mysql_password=testuserpass \
--from-literal=mysql_user=$(minikube ip) 

并在 application.properties 中使用这些内容,如下所示

spring.datasource.url = jdbc:mysql://${MYSQL_HOST}:3306/test?useSSL=false
spring.datasource.username = ${MYSQL_USER}
spring.datasource.password = ${MYSQL_PASSWORD}
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

然后在deployment.yaml 中为kubernetes 使用configmap 值。 然后确实启动了部署服务。

【讨论】:

    【解决方案3】:

    如果你的项目是 Maven,你可以使用 Maven 过滤器:

    <build>
      <filters>
                <filter>src/main/filters/myfilter.properties</filter>
      </filters>
    </build>
    

    这会生成/target/classes/application.properties,它已被过滤以包含属性值(带有替换的占位符)

    http://www.avajava.com/tutorials/lessons/how-do-i-filter-resources-based-on-values-from-a-properties-file.html?page=1

    【讨论】:

      猜你喜欢
      • 2014-07-16
      • 1970-01-01
      • 2016-02-22
      • 2020-12-24
      • 2020-04-01
      • 2019-07-19
      • 2018-08-03
      • 2015-06-02
      • 2021-03-08
      相关资源
      最近更新 更多