当前位置: 首页 > 知识库问答 >
问题:

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

洪鹏海
2023-03-14

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

Spring Boot相当方便地将所有环境变量从foo_bar_baz转换为Spring上下文中称为foo.bar.baz的属性。

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

共有1个答案

龙隐水
2023-03-14

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

HIBERNATE_FORMAT_SQL应该能起到这个作用

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

该名称以多种方式进行翻译,并根据可用的环境变量进行查找。例如。“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

 类似资料:
  • 问题内容: 我需要动态设置JS对象属性名称。 结果应为: 问题答案:

  • 问题内容: 我正在尝试设置脚本以增加Xcode项目的内部版本号。我进行了一次API调用以获取当前的内部版本号,然后我希望对其进行递增,然后将该新的版本号用作环境变量,以便Xcode插件可以使用它。 我安装了EnvInject插件,但是我不知道如何将var从我的shell脚本中获取到环境变量中。 这设置为我需要的值,但是如何将其分配给环境变量,以便以后在工作中访问它? 问题答案: 添加一个构建步骤以

  • 问题内容: 我们使用spring 3.1的新环境配置文件功能。当前,我们通过在将应用程序部署到的服务器上设置环境变量spring.profiles.active = xxxxx来设置活动配置文件。 我们认为这是次优的解决方案,因为我们要部署的war文件应该只具有一个附加的属性文件,该文件设置了应加载spring应用上下文的环境,因此部署不依赖于服务器上设置的某些环境变量。 我试图弄清楚该怎么做,发

  • 带有Spring-Data的JPA对名称中带有下划线“_”的属性有问题吗?这是我扩展的接口: 这一行:<code>findByA_my_table_id(长头id) 给出此错误: 无效的派生查询!没有为类型 MyClass 找到属性“a”! 如果我将方法命名为< code > public my class find bya _ my _ table _ id(Long header id);它给

  • 我有一个values.yaml,我将一个值存储在一个属性中,还有一个deployment.yaml,我尝试将该值赋给一个环境变量。问题是属性名包含破折号,并抛出以下错误消息。 “空值”是因为我试图将名称引用为 {{ Values.security.enablemockservice | 引号 }},而不使用缓行绑定的破折号,但实际的属性名称是 Values.security.enable-mock

  • 问题内容: 运行将返回“ Clear Workspace = true”。如何在bash中访问它?仅供参考,它来自Jenkins Parameterized Build参数名称。似乎不起作用。 而且,詹金斯怎么能创建这个环境变量?在bash中运行显然不起作用,因为它尝试使用参数“ Workspace = true”运行“ Clear”命令。 我当然可以将作业参数名称设置为Clear_Workspa