Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin数据类上带有默认值的Spring构造函数注释_Spring_Kotlin - Fatal编程技术网

Kotlin数据类上带有默认值的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时,它总是失败 看起来,通过为参数设置默认值

为了使用spring持久性但维护不可变的类型,我将PersistenceConstructor注释添加到了我的数据类中。这告诉spring在从数据库加载类时使用该构造函数

然而,我很难让spring找到构造函数

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
注释