将spring数据mongodb与Kotlin一起使用时出现异常

将spring数据mongodb与Kotlin一起使用时出现异常,kotlin,spring-data-mongodb,Kotlin,Spring Data Mongodb,我是Kotlin的新手,正在试用spring数据mongodb。请参见下面的示例(这里还提供了内存中MongoDb:的完全可运行Maven项目) Application.kt package dsitest import org.springframework.boot.SpringApplication import org.springframework.boot.autoconfigure.SpringBootApplication @SpringBootApplication ope

我是Kotlin的新手,正在试用spring数据mongodb。请参见下面的示例(这里还提供了内存中MongoDb:的完全可运行Maven项目)

Application.kt

package dsitest

import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.SpringBootApplication

@SpringBootApplication
open class Application

fun main(args: Array<String>) {
    SpringApplication.run(Application::class.java, *args)
}
UserRepository.kt

package dsitest

import org.springframework.data.repository.CrudRepository

interface UserRepository : CrudRepository<User, String>
运行测试KotlinIntegrationTest.persistenceTest时,我在尝试从MongoDb检索用户对象时收到以下错误消息:

org.springframework.data.mapping.model.MappingException: No property null found on entity class dsitest.User to bind constructor parameter to!
如果我修改用户数据类,使userName可以为null,那么一切都可以正常工作

data class User @PersistenceConstructor constructor(@Id val id: String? = null,
val userName: String? = null)
我想了解为什么会出现这种情况,因为我不希望用户名为空。是否有其他更好的方法在Kotlin中定义我的用户类

非常感谢,,
丹尼尔是的,这是一个已知的问题。您应该检查用户类的字节码的外观。Java看到所有参数都存在的构造函数,并尝试使用第二个参数的空值调用它

您可以做的是尝试添加到构造函数中——这将迫使Kotlin编译器生成所有版本的构造函数,这样Spring数据Mongo就可以选择正确的构造函数(去掉@PersistenceConstructor)

您还可以定义一个没有默认值的构造函数——仅用于基于Java的框架,第二个构造函数具有一些默认值。或者


当我编写像您现在这样的东西时,我创建了简单的“持久性”数据类,这些数据类没有任何默认值映射到我的常规域对象(一种对数据库的抽象)。一开始可能会产生一些开销,但无论如何,保持您的域模型与存储模型不紧密耦合通常是一个好主意。

谢谢Rafal,非常感谢。但我不确定我是否完全理解。为什么Spring使用用户名的空值调用讲师?为什么它不使用从数据库加载的用户名呢?好吧(哈哈)我可能错了。。。尝试将@Field添加到第二个参数:)这应该是可接受的答案!(
@JvmOverloads
org.springframework.data.mapping.model.MappingException: No property null found on entity class dsitest.User to bind constructor parameter to!
data class User @PersistenceConstructor constructor(@Id val id: String? = null,
val userName: String? = null)