这是一个老问题,但如果其他人(如我)最终在这里寻找此信息,我会回答它。
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
这里的 cmets 中更棘手的示例,例如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