Spring Kotlin 数据上的构造函数注释 class 具有默认值
Spring constructor annotations on Kotlin data class with default values
为了使用 spring 持久性但保持不可变类型,我已将 PersistenceConstructor 注释添加到我的数据 类。这告诉 spring 在从数据库加载 类 时使用该构造函数。
但是,我无法 spring 找到构造函数。
data class MyData @PersistenceConstructor constructor(@Id val id: Int? = null, val a:String)
这在我的机器上 100% 的时间都有效,但是当部署到 heroku 时,它总是失败。
看起来,通过为参数设置默认值,kotlin 生成了多个构造函数,但问题是每个构造函数都得到了应用于它们的注释,所以这只是运气(或 jdk 特定于实现)哪一个spring 拿起。默认参数没有名称,因此 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)
}
我不喜欢它的重复,所以它不是我的首选解决方案。
您可以使用 @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 的更多信息。
为了使用 spring 持久性但保持不可变类型,我已将 PersistenceConstructor 注释添加到我的数据 类。这告诉 spring 在从数据库加载 类 时使用该构造函数。
但是,我无法 spring 找到构造函数。
data class MyData @PersistenceConstructor constructor(@Id val id: Int? = null, val a:String)
这在我的机器上 100% 的时间都有效,但是当部署到 heroku 时,它总是失败。
看起来,通过为参数设置默认值,kotlin 生成了多个构造函数,但问题是每个构造函数都得到了应用于它们的注释,所以这只是运气(或 jdk 特定于实现)哪一个spring 拿起。默认参数没有名称,因此 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)
}
我不喜欢它的重复,所以它不是我的首选解决方案。
您可以使用 @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 的更多信息。