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

标签 java spring spring-boot

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

Spring Boot 可以轻松地将所有环境变量从例如 FOO_BAR_BAZ 转换为 Spring 上下文中名为 foo.bar.baz 的属性。

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

最佳答案

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

HIBERNATE_FORMAT_SQL 应该可以解决问题

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

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

  1. hibernate.format.sql(原样)
  2. hibernate_format_sql(点替换为下划线)
  3. hibernate_format_sql(用下划线替换破折号,在你的情况下也是如此)
  4. hibernate_format_sql(破折号和点替换为下划线,在您的情况下相同)

然后与大写相同:

  1. HIBERNATE.FORMAT.SQL(原样)
  2. HIBERNATE_FORMAT_SQL(点替换为下划线)
  3. HIBERNATE_FORMAT_SQL(破折号替换为下划线,再次相同)
  4. HIBERNATE_FORMAT_SQL(破折号和点替换为下划线,再次相同)

虽然您不能使用 set 或 export 命令设置名称中带有点的环境变量,但是可以使用 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;

希望这会有所帮助! YMMV

关于java - 如何通过环境变量设置名称中带有下划线的 Spring Boot 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34178556/

相关文章:

java - 如何将 IOException 作为自定义运行时异常 Java 8 吞下

java - ComponentScan excludeFilters 在 Spring 4.0.6.RELEASE 中不起作用

java - maven 中的 javax.jms.* 在哪里

java - 我想知道我的结构是否适合我所做的应用程序

java - EmbeddedKafkaRule没有brokerListProperty方法

java - 如何在rs232连接上写入

java - FireStore 数据未显示正在访问隐藏方法 Lsun/misc/Unsafe;->putLong(Ljava/lang/Object;JJ)V(灰名单、链接、允许)

java - 如何获取数组数组的单个数组名称作为字符串

java - HttpSecurity 配置 - permitall 仍然需要基本身份验证

java - Spring Boot 应用程序日志显示 iRAv2 格式日志