如何通过环境变量设置名称中带有下划线的Spring Boot属性?

2022-09-01 09:44:08

我想在Spring Boot应用程序中进行设置。我想使用环境变量设置它。hibernate.format_sql

Spring Boot 相当轻松地将所有环境变量从(例如)转换为在 Spring 上下文中调用的属性。FOO_BAR_BAZfoo.bar.baz

如何使用环境变量在 Spring Boot 中设置目标名称中包含下划线的属性?大概会翻译成 ?HIBERNATE_FORMAT_SQLhibernate.format.sql


答案 1

这是一个老问题,但我会回答它,以防其他人(像我一样)最终在这里寻找这些信息。

HIBERNATE_FORMAT_SQL应该做到这一点

实际上,“翻译”的不是操作系统环境变量,而是Spring属性名称。

该名称以多种方式进行转换,并根据可用的环境变量进行查找。例如,“hibernate.format.sql”被查找为:

  1. hibernate.format.sql (按原样)
  2. hibernate_format_sql(用下划线替换点)
  3. hibernate_format_sql(用下划线替换破折号,在你的情况下是一样的)
  4. hibernate_format_sql(用下划线替换破折号和点,在你的情况下是一样的)

然后与大写字母相同:

  1. 冬眠。格式。SQL(按原样)
  2. HIBERNATE_FORMAT_SQL(用下划线替换点)
  3. HIBERNATE_FORMAT_SQL(用下划线替换破折号,同样如此)
  4. HIBERNATE_FORMAT_SQL(用下划线替换破折号和点,同样如此)

虽然不能使用 set 或 导出 命令设置名称中带有点的环境变量,但使用 env 命令是可能的。我推迟判断这是否是一个好主意:

env "my.dotted.name=\"a value\"" the-command-you-want-to-run

有关详细信息,请查看 SystemEnvironmentPropertySource.java。我链接到一个特定的版本,但你应该确保看看你正在使用的版本。

若要解决生产环境中的这些类型问题,可以尝试为属性解析代码启用调试日志记录:

logging:
  level:
    org.springframework.core.env: DEBUG

...或通过设置适当的环境变量:)

编辑:我强烈建议熟悉相关的Spring Boot文档主题:https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config

对于此处注释中更棘手的示例,例如,根据您启动应用程序的方式,可能会有不同的解决方案可用。spring.jpa.properties.hibernate.criteria.literal_handling_mode

您可以将变量设置为 JSON,嵌入到环境变量中。

env SPRING_APPLICATION_JSON='{"spring":{"jpa":{"properties":{"hibernate":{"criteria":{"literal_handling_mode":"BIND"}}}}}}' ./gradlew bootRun

简单地将变量设置为原样也可能有效:

env spring.jpa.properties.hibernate.criteria.literal_handling_mode=BIND ./gradlew bootRun

以上两者都在我的设置中起作用,因为我能够以这种方式在正在运行的Spring Boot应用程序中获取值:

@Value("${spring.jpa.properties.hibernate.criteria.literal_handling_mode}")
private String testSettingThroughEnvVariable;

希望这有帮助!断续器


答案 2

事实证明,工作得很好。我不知道这是否意味着该特定属性的名称过载,或者Spring是否正在做一些更聪明的事情。它解决了我的问题,并为我询问的示例提供了所需的行为。SPRING_JPA_SHOW_SQL=true


推荐