要使用spring持久性但保持不可变类型,我已将PersistenceConstructor注释添加到我的数据类中。这告诉spring在从数据库加载类时使用该构造函数。
但是,我很难找到构造函数。
data class MyData @PersistenceConstructor constructor(@Id val id: Int? = null, val a:String)
这在我的机器上100%有效,但是当部署到heroku时,它始终失败。
看起来,通过让参数kotlin的默认值生成多个构造函数,但问题是每个构造函数都会获得应用于它们的注释,因此它只是运气(或特定于jdk实现),一个春天选择起来。默认的参数没有名称,因此Spring不知道如何处理它。
我真正的构造函数比这大,所以没有默认值会很痛苦。有没有办法让注释只应用于没有默认值的构造函数?
答案 0 :(得分:8)
您可以使用@JvmOverloads
annotation,这将自动创建可由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 calling Kotlin interoperability的更多信息。
答案 1 :(得分:3)
目前我的答案是定义两个构造函数。一个供我使用,有默认值,一个用于弹簧,没有默认值。
return body
我不喜欢它的重复,因此它不是我首选的解决方案。