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

时间:2015-12-09 12:13:35

标签: 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

3 个答案:

答案 0 :(得分:21)

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

HIBERNATE_FORMAT_SQL应该做的伎俩

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

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

  1. hibernate.format.sql(原样)
  2. hibernate_format_sql(点用下划线替换)
  3. hibernate_format_sql(破折号替换为下划线,在您的情况下相同)
  4. hibernate_format_sql(用下划线替换破折号和点数,在您的情况下相同)
  5. 然后与大写相同:

    1. HIBERNATE.FORMAT.SQL(原样)
    2. HIBERNATE_FORMAT_SQL(点用下划线代替)
    3. HIBERNATE_FORMAT_SQL(破折号替换为下划线,同样再次)
    4. HIBERNATE_FORMAT_SQL(用下划线替换破折号和点数,再次相同)
    5. 虽然您无法使用set或export命令在名称中设置带点的环境变量,但可以使用env命令。我推迟判断这是否是个好主意:

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

      看看SystemEnvironmentPropertySource.java   详情。我链接到特定版本,但您应该确保查看您正在使用的版本。

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我遇到了同样的问题,环境变量 spring_jpa_properties_hibernate_default_schema Spring 翻译为 spring.jpa.properties.hibernate.default.schema,但 Hibernate 需要 hibernate.default_schema

出于某些原因(devops 问题),我无法将其更改为 spring.jpa.properties.hibernate.default_schema - 它可以在本地机器上运行。

我是这样解决的

@Component
public class HibernateConfig implements HibernatePropertiesCustomizer {

    private final static String HIBERNATE_CUSTOM_DEFAULT_SCHEMA_PARAM = "hibernate.default.schema";

    @Override
    public void customize(Map<String, Object> hibernateProperties) {
        if (hibernateProperties.containsKey(HIBERNATE_CUSTOM_DEFAULT_SCHEMA_PARAM)) {
            hibernateProperties.put(AvailableSettings.DEFAULT_SCHEMA, hibernateProperties.get(HIBERNATE_CUSTOM_DEFAULT_SCHEMA_PARAM));
        }
    }
}