gpt4 book ai didi

kotlin - 将 spring-data-mongodb 与 Kotlin 一起使用时出现异常

转载 作者:行者123 更新时间:2023-12-02 04:34:47 26 4
gpt4 key购买 nike

我是 Kotlin 新手,正在尝试 spring-data-mongodb。请参阅下面的示例(也可以在此处作为带有内存中 MongoDb 的完全可运行的 Maven 项目: https://github.com/danielsindahl/spring-boot-kotlin-example )。

应用程序.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)
}

用户.kt

package dsitest

import org.springframework.data.annotation.Id
import org.springframework.data.annotation.PersistenceConstructor
import org.springframework.data.mongodb.core.mapping.Document

@Document(collection = "user")
data class User @PersistenceConstructor constructor(@Id val id: String? = null, val userName: String)

用户存储库.kt

package dsitest

import org.springframework.data.repository.CrudRepository

interface UserRepository : CrudRepository<User, String>

KotlinIntegrationTest.kt

package dsitest

import org.junit.Test
import org.junit.runner.RunWith
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.context.junit4.SpringRunner

@RunWith(SpringRunner::class)
@SpringBootTest
class KotlinIntegrationTest constructor () {

@Autowired
lateinit var userRepository : UserRepository;

@Test
fun persistenceTest() {
val user : User = User(userName = "Mary")
val savedUser = userRepository.save(user)
val loadedUser = userRepository.findOne(savedUser.id) // Failing code
println("loadedUser = ${loadedUser}")
}
}

运行测试 KotlinIntegrationTest.persistenceTest 时,尝试从 MongoDb 检索 User 对象时收到以下错误消息:

org.springframework.data.mapping.model.MappingException: No property null found on entity class dsitest.User to bind constructor parameter to!

如果我修改用户数据类以使 userName 可为空,则一切正常。

data class User @PersistenceConstructor constructor(@Id val id: String? = null,
val userName: String? = null)

我想了解为什么会出现这种情况,因为我不希望 userName 可为空。有没有一些替代的、更好的方法来在 Kotlin 中定义我的 User 类?

非常感谢,丹尼尔

最佳答案

是的,这是一个已知问题。您应该检查 User 类的字节码是什么样的。 Java 看到包含所有参数的构造函数,并尝试使用第二个参数的 null 值来调用它。

您可以尝试添加 @JvmOverloads到你的构造函数 - 这将强制 Kotlin 编译器生成构造函数的所有版本,因此 Spring Data Mongo 可以选择正确的版本(摆脱 @PersistenceConstructor)。

您还可以定义 1 个没有默认值的构造函数 - 仅适用于基于 Java 的框架,而第二个构造函数则带有一些默认值。或者...

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

关于kotlin - 将 spring-data-mongodb 与 Kotlin 一起使用时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41715144/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com