@带有不可变属性的构造函数绑定不能与spring boot kotlin@configurationproperties中的@value一起使用

w41d8nur  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(314)

Spring Boot支持kotlin data 课程 @ConfigurationProperties .

@ConstructorBinding
@ConfigurationProperties(prefix = "prefix")
data class AppProperties (
    val something: String
)

但是 val 以及 @ConstructorBinding 有一些局限性。不能将一个变量别名为另一个变量。假设您正在kubernetes中运行,并希望捕获由env var提供的主机名 HOSTNAME . 最简单的方法就是申请 @Value("\${HOSTNAME}:)" 但它只适用于可变属性,并且没有构造函数绑定。
spring boot github问题跟踪者说:
住手!!请询问有关如何使用spring引导标记在堆栈溢出上使用某些东西的问题,或者理解为什么某些东西不能像您期望的那样工作。
那么,这是一个已知的限制,还是我应该为他们创建一个票据来修复它?
编辑:打开https://github.com/spring-projects/spring-boot/issues/25552

toe95027

toe950271#

@ConfigurationProperties 是替代 @Value 而这两种设计并不是为了一起使用。它可以与javabean风格的绑定一起工作,但这是偶然的,而不是设计的,因此不应该依赖它。
而不是使用 @Value 使某物通过 @ConfigurationProperties ,建议您通过其他方式进行。例如,你可以使用这个答案中建议的方法之一,马可斯·巴贝罗在对你的问题的评论中提到了这个方法。或者,您可以从文档中的这个示例中获得一些灵感,并在中使用占位符 application.properties :

prefix.something=${hostname}

另一种选择是通过 META-INF/spring.factories 实现 EnvironmentPostProcessor 这增加了 PropertySource 以设置所需的别名。就目前而言,如果您想在可重用库中执行某些操作,这可能是最好的方法。有一个开放的问题,以消除一些仪式,目前涉及。

相关问题