具有不可变属性的@ConstructorBinding不适用于SpringBootKotlin@ConfigurationProperties中的@Value
Spring Boot 支持data用于@ConfigurationProperties.
@ConstructorBinding
@ConfigurationProperties(prefix = "prefix")
data class AppProperties (
val something: String
)
但是,val和@ConstructorBinding具有一定的局限性。您不能将一个变量别名为另一个变量。假设您在 Kubernetes 中运行并想要捕获由 env var 给出的主机名HOSTNAME。执行此操作的最简单方法是应用于@Value("${HOSTNAME}:)"属性,但它仅适用于可变属性且没有构造函数绑定。
Spring Boot GitHub 问题跟踪器说:
停止!!请使用 spring-boot 标签在 Stack Overflow 上询问有关如何使用某些东西的问题,或者了解为什么某些东西没有按预期工作。
那么,这是一个已知的限制还是我应该为他们创建一张票来修复它?
编辑:打开https://github.com/spring-projects/spring-boot/issues/25552
回答
@ConfigurationProperties是一种替代方案,@Value两者并非设计为一起使用。它可能与 JavaBean 风格的绑定一起工作,但那是偶然的,而不是设计的,不应该依赖它。
不要使用@Value别名绑定 via @ConfigurationProperties,建议您通过其他方式这样做。例如,您可以使用Marcos Barbero 在您的问题的评论中链接到的此答案中建议的方法之一。或者,您可以从文档中的这个示例中获得一些灵感,并在 中使用占位符application.properties:
prefix.something=${hostname}
另一种选择是通过向环境添加一个META-INF/spring.factories实现来注册以设置所需的别名。目前,如果您想在可重用的库中做某事,这可能是最好的方法。有一个未解决的问题可以删除当前涉及的一些仪式。EnvironmentPostProcessorPropertySource