簡體   English   中英

帶有默認值的Kotlin數據類上的Spring構造函數注釋

[英]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.

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