簡體   English   中英

具有不可變屬性的@ConstructorBinding 不適用於 Spring 引導 Kotlin @ConfigurationProperties 中的 @Value

[英]@ConstructorBinding with immutable properties don't work with @Value in Spring Boot Kotlin @ConfigurationProperties

Spring 引導支持@ConfigurationProperties的 Kotlin data類。

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

但是val@ConstructorBinding有一些限制。 您不能將一個變量別名為另一個變量。 假設您在 Kubernetes 中運行,並且想要捕獲由 env var HOSTNAME給出的主機名。 最簡單的方法是將@Value("\${HOSTNAME}:)"應用於屬性,但它僅適用於可變屬性並且沒有構造函數綁定。

Spring 引導 GitHub 問題跟蹤器說:

停止,請詢問有關如何使用某些東西的問題。 或者要了解為什么某些東西沒有按預期工作,請在 Stack Overflow 上使用 spring-boot 標簽。

那么,這是一個已知的限制,還是我應該為他們創建一張票來修復它?

編輯:打開https://github.com/spring-projects/spring-boot/issues/25552

@ConfigurationProperties@Value的替代品,兩者並非設計為一起使用。 它可以與 JavaBean 樣式的綁定一起使用,但這只是偶然而不是設計使然,因此不應依賴它。

建議您通過其他方式這樣做,而不是使用@Value對通過@ConfigurationProperties綁定的內容進行別名。 例如,您可以使用 Marcos Barbero 在對您的問題的評論中鏈接到的這個答案中建議的方法之一。 或者,您可以從文檔中的此示例中獲取一些靈感,並在application.properties中使用占位符:

prefix.something=${hostname}

另一種選擇是通過META-INF/spring.factories注冊EnvironmentPostProcessor的實現,它將PropertySource添加到環境中以設置所需的別名。 目前,如果您想在可重用的庫中做某事,這可能是最好的方法。 一個未解決的問題要刪除當前涉及的一些儀式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM