带有默认值的Kotlin数据类上的Spring构造函数注释

时间:2015-09-04 03:43:17

标签: spring kotlin

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

但是,我很难找到构造函数。

data class MyData @PersistenceConstructor constructor(@Id val id: Int? = null, val a:String)

这在我的机器上100%有效,但是当部署到heroku时,它始终失败。

看起来,通过让参数kotlin的默认值生成多个构造函数,但问题是每个构造函数都会获得应用于它们的注释,因此它只是运气(或特定于jdk实现),一个春天选择起来。默认的参数没有名称,因此Spring不知道如何处理它。

我真正的构造函数比这大,所以没有默认值会很痛苦。有没有办法让注释只应用于没有默认值的构造函数?

2 个答案:

答案 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

我不喜欢它的重复,因此它不是我首选的解决方案。