Java “弹簧靴”@条件属性(值=)”;注入文字字符串
我有一个Spring Boot应用程序,其中一个类被注释为Java “弹簧靴”@条件属性(值=)”;注入文字字符串,java,spring,spring-boot,kotlin,properties-file,Java,Spring,Spring Boot,Kotlin,Properties File,我有一个Spring Boot应用程序,其中一个类被注释为@RestController,并且在我的类MyRestController.kt(kotlin)上也有@conditionalnproperty注释,如下所示: @RestController @ConditionalOnProperty(value=[“app.running mode.read-write”],havingValue=“true”,matchIfMissing=true) 类MyRestController(私有值r
@RestController
,并且在我的类MyRestController.kt
(kotlin)上也有@conditionalnproperty
注释,如下所示:
@RestController
@ConditionalOnProperty(value=[“app.running mode.read-write”],havingValue=“true”,matchIfMissing=true)
类MyRestController(私有值r:MyRestService){
@GetMapping
//这里有一个端点
@邮戳
//这里有一个端点
}
我的application.properties
如下所示:
app.running-mode.read-write=${MY_API_RUNNING_MODE_READ_WRITE}
当我有时运行我的应用程序时,它会在我的类上崩溃,该类包含此条件属性注释MyRestController.kt
,我看到它说:
Could not resolve placeholder 'MY_API_RUNNING_MODE_READ_WRITE` in value "${MY_API_RUNNING_MODE_READ_WRITE}"
这应该是Azure设置的一个环境变量,但是我是否有可能错误地定义了我的@conditionalnproperty
,以致于它注入了文本字符串(如日志中所示),而不是环境变量?(顺便说一句,它应该是布尔值true
或false
)问题可能来自于您提供值的方式。由于您正在为不同的环境注入来自环境的值,因此该值可能不存在,甚至可能在环境中提供了错误的值。向veirfy检查是否正确提供。确保环境配置了键“MY\u API\u RUNNING\u MODE\u READ\u 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
}
可能是应用程序启动后,正在环境中设置我的API运行模式读写。但在控制器中,如果变量未设置,则可以原谅。因此,在application.properties中,还可以添加默认值。app.running mode.read-write=${MY\u API\u running\u mode\u read\u write:defaultValue}然后,如果未设置环境变量,应用程序仍将启动,也许您可以使用shell或其他工具登录到运行它的映像中,并查看变量是否存在?@Smile我在MY\u API\u RUNNING\u MODE\u READ\u WRITE
变量确实存在时登录到云服务器。该应用程序只是一个WAR文件,目前已崩溃,无法部署,因为它一直抛出相同的java.lang。我上面列出的例外情况,好像是注入了文字字符串。@Ole Billie,如果它真的注入了环境变量而不是某个字符串,那么我应该能够在本地运行它,并且只需在Windows中设置一个环境变量,如MY\u API\u RUNNING\u MODE\u READ\u WRITE=true
,那么属性文件应该会将其拾取,是吗?i、 e app.running mode.read-write=${MY\u API\u running\u mode\u read\u write}问题是,除非我将.properties中的值硬核化(true或false)…否则这永远不会在本地工作。因此它只注入“${MY\u API\u running\u mode\u read\u write}”的文本字符串难道不是吗……你没有匹配属性名和环境变量名的具体原因是什么,因为它们已经非常接近了吗?是的,我实际上正在部署到Azure云,我登录到他们的远程服务器,并验证了环境变量MY_API\u RUNNING\u MODE\u READ\u WRITE
确实存在。我甚至重新部署了我的应用程序,但它仍然失败了,这让我觉得它与环境变量是否存在无关。@en您是否在azure实例上部署了spring boot docker映像?如何设置环境变量,是否将其配置为在部署之前运行。?