Kotlin数据类上带有默认值的Spring构造函数注释
为了使用spring持久性但维护不可变的类型,我将PersistenceConstructor注释添加到了我的数据类中。这告诉spring在从数据库加载类时使用该构造函数 然而,我很难让spring找到构造函数Kotlin数据类上带有默认值的Spring构造函数注释,spring,kotlin,Spring,Kotlin,为了使用spring持久性但维护不可变的类型,我将PersistenceConstructor注释添加到了我的数据类中。这告诉spring在从数据库加载类时使用该构造函数 然而,我很难让spring找到构造函数 data class MyData @PersistenceConstructor constructor(@Id val id: Int? = null, val a:String) 这在我的机器上100%的时间都有效,但部署到heroku时,它总是失败 看起来,通过为参数设置默认值
data class MyData @PersistenceConstructor constructor(@Id val id: Int? = null, val a:String)
这在我的机器上100%的时间都有效,但部署到heroku时,它总是失败
看起来,通过为参数设置默认值,kotlin生成了多个构造函数,但问题是每个构造函数都应用了注释,所以一个spring选择的只是运气(或jdk实现特有的)。默认的参数没有名称,因此Spring不知道如何处理它
我的实际构造函数比这个大,所以没有默认值会很痛苦。有没有办法让注释只应用于构造函数而不使用默认值 目前我的答案是定义两个构造函数。一个供我使用,有默认值,另一个供spring使用,没有默认值
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)
}
data类MyData@PersistenceConstructor构造函数(val a:Int?,val b:String,val c:Collection){
构造函数(a:Int?=null,b:String=“”,c:Collection=emptyList()):这个(a,b,c)
}
我不喜欢它的重复,因此它不是我首选的解决方案。您可以使用,这将自动创建可由Java调用的方法的置换,并利用默认值
从文档中,可以看到以下示例:
@JvmOverloads fun f(a: String, b: Int = 0, c: String = "abc") {
...
}
将从Java中看到:
//Java
void f(字符串a,int b,字符串c){}
void f(字符串a,int b){}//将默认为c
void f(字符串a){}//将默认为b和c
您的情况与此完全不同,您有一个默认参数,后面跟着一个非默认参数。将您的示例简化为:
data class MyData @JvmOverloads constructor(val id: Int? = null, val a:String)
从Java生成此视图:
//java
MyData(整数id,字符串a)
MyData(字符串a)//默认id
您可以在Kotlin参考中阅读更多信息。在没有任何其他答案的情况下,我将此标记为已接受的解决方案,但仍对其他更简单的选项感兴趣。Kotlin支持此问题的答案,而无需执行此解决方法。查看发布的另一个答案。Kotlin中现在有其他选项,我添加了一个涵盖@JVMLowloads的答案,实际上这似乎是JVMLowloads的副作用,因为Kotlin数据类中缺少构造函数参数名才是真正的问题。实际上,kotlinThis中的错误似乎不起作用,如果您将可选字段(具有默认值)标记为
@Transient
。解决方案是手动创建构造函数并添加@PersistenceConstructor
注释