[英]How to pass class constructor parameters in Spring bean Autowired by annotations
[英]Spring constructor annotations on Kotlin data class with default values
要使用spring持久性但保持不可變類型,我已將PersistenceConstructor注釋添加到我的數據類中。 這告訴spring在從數據庫加載類時使用該構造函數。
但是,我在找到構造函數時遇到問題。
data class MyData @PersistenceConstructor constructor(@Id val id: Int? = null, val a:String)
這在我的機器上100%的時間工作,但當部署到heroku時,它始終失敗。
看起來,通過讓參數的默認值kotlin生成多個構造函數,但問題是每個構造函數都會獲得應用於它們的注釋,因此它只是運氣(或特定於jdk實現),這是一個春天選擇的。 默認的參數沒有名稱,因此Spring不知道如何處理它。
我真正的構造函數比這個大,所以沒有默認值會很痛苦。 有沒有辦法讓注釋只應用於沒有默認值的構造函數?
您可以使用@JvmOverloads
注釋 ,這將自動創建可由Java調用的方法的排列,並利用默認值。
從文檔中,這個例子:
@JvmOverloads fun f(a: String, b: Int = 0, c: String = "abc") {
...
}
將從Java中看到:
// Java
void f(String a, int b, String c) { }
void f(String a, int b) { } // will default c
void f(String a) { } // will default b and c
如果您有一個默認參數,后跟一個不是默認參數,那么您的情況會有所不同。 將您的示例簡化為:
data class MyData @JvmOverloads constructor(val id: Int? = null, val a:String)
從Java生成此視圖:
// java
MyData(Int id, String a)
MyData(String a) // defaults id
您可以在Kotlin參考中閱讀有關Java調用Kotlin互操作性的更多信息。
目前我的答案是定義兩個構造函數。 一個供我使用,有默認值,一個用於彈簧,沒有默認值。
data class MyData @PersistenceConstructor constructor(val a: Int?, val b:String, val c : Collection<Int>) {
constructor(a: Int? = null, b: String = "", c: Collection<Int> = emptyList()) : this(a,b,c)
}
我不喜歡它作為它的重復,所以它不是我的首選解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.