【发布时间】: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 定义不正确,以至于它注入了日志中所见的文字字符串,而不是环境变量? (顺便说一下,应该是布尔值true 或false)
【问题讨论】:
-
可能是
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