【问题标题】:Spring boot "@ConditionalOnProperty(value =)" injecting literal StringSpring boot“@ConditionalOnProperty(value =)”注入文字字符串
【发布时间】:2021-01-13 17:06:43
【问题描述】:

我有一个 Spring Boot 应用程序,其中一个类被注释为 @RestController,并且在我的类 MyRestController.kt (kotlin) 上也有 @ConditionalOnProperty 注释,如下所示:

@RestController
@ConditionalOnProperty(value = ["app.running-mode.read-write"],havingValue = "true", matchIfMissing = true)

class MyRestController(private val r : MyRestService){
    @GetMapping
    // some endpoint here
    
    @PostMapping
    // some endpoint here
}

我的application.properties 看起来像这样:

app.running-mode.read-write=${MY_API_RUNNING_MODE_READ_WRITE}

当我有时运行我的应用程序时,它会在包含此 ConditionalOnProperty 注释 MyRestController.kt 的类上的 java.lang.IllegalStateException 崩溃,我看到它说:

Could not resolve placeholder 'MY_API_RUNNING_MODE_READ_WRITE` in value "${MY_API_RUNNING_MODE_READ_WRITE}"

这应该是 Azure 设置的环境变量,但我是否可能将我的 @ConditionalOnProperty 定义不正确,以至于它注入了日志中所见的文字字符串,而不是环境变量? (顺便说一下,应该是布尔值truefalse

【问题讨论】:

  • 可能是MY_API_RUNNING_MODE_READ_WRITE在应用程序启动后被设置在环境中。
  • 你在做什么似乎是正确的。但是在控制器中,如果未设置变量,则可以原谅。因此,在您的 application.properties 中,您还可以添加一个默认值。 app.running-mode.read-write=${MY_API_RUNNING_MODE_READ_WRITE:defaultValue} 然后,如果未设置环境变量,应用程序仍将启动,也许您可​​以使用 shell 或其他东西登录到您运行它的映像,看看是否变量是否存在?
  • @Smile 我登录云服务器时,MY_API_RUNNING_MODE_READ_WRITE 变量确实存在。该应用程序只是一个 WAR 文件,目前已崩溃并且不会部署,因为它一直在抛出相同的 java.lang。我上面列出的异常,好像它注入了文字字符串。
  • @Ole Billie,如果它是真正注入环境变量而不是一些字符串,那么我应该能够在本地运行它,只需在 Windows 中设置一个环境变量,如 MY_API_RUNNING_MODE_READ_WRITE=true 然后属性文件应该捡起来吧?即 app.running-mode.read-write=${MY_API_RUNNING_MODE_READ_WRITE} 好吧,问题是,除非我硬核 .properties 中的值(真或假),否则这永远不会在本地工作......所以它只是注入文字“${MY_API_RUNNING_MODE_READ_WRITE}”的字符串是不是.....
  • 属性名称和环境变量名称不匹配是否有特定原因,因为它们已经如此接近?

标签: java spring spring-boot kotlin properties-file


【解决方案1】:

问题可能源于您提供价值的方式。由于您要从环境中为不同的环境注入值,因此该值可能不存在,甚至可能在环境中错误地提供。检查以验证它是否正确提供。确保使用“MY_API_RUNNING_MODE_READ_WRITE”键配置环境。

由于您正在读取来自 application.properties 的值,因此请在删除 '[]' 后尝试提供如下所示的值:

@RestController
@ConditionalOnProperty(value = "app.running-mode.read-write",havingValue = "true", matchIfMissing = true)

class MyRestController(private val r : MyRestService){
    @GetMapping
    // some endpoint here
    
    @PostMapping
    // some endpoint here
}

【讨论】:

  • 是的,我实际上正在部署到 Azure 云,我登录到他们的远程服务器并验证了环境变量 MY_API_RUNNING_MODE_READ_WRITE 确实在那里。我什至重新部署了我的应用程序,但它仍然失败,这让我认为它与环境变量是否存在无关。
  • @ennthare 您在您的 azure 实例上部署了 Spring Boot Docker 映像吗?环境变量是如何设置的,是否配置为在部署之前运行。?
猜你喜欢
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 2021-09-02
  • 2021-08-02
  • 2021-09-24
  • 1970-01-01
相关资源
最近更新 更多