我想在 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”查找为:
- hibernate.format.sql(原样)
- hibernate_format_sql(点替换为下划线)
- hibernate_format_sql(用下划线替换破折号,在你的情况下也是如此)
- hibernate_format_sql(破折号和点替换为下划线,在您的情况下相同)
然后与大写相同:
- HIBERNATE.FORMAT.SQL(原样)
- HIBERNATE_FORMAT_SQL(点替换为下划线)
- HIBERNATE_FORMAT_SQL(破折号替换为下划线,再次相同)
- 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/