私はKotlinを初めて使い、spring-data-mongodbを試してみます。下記の例を参照してください(メモリ内のMongoDbで完全実行可能なMavenプロジェクト:https://github.com/danielsindahl/spring-boot-kotlin-exampleとしても利用可能です)。Kotlinでspring-data-mongodbを使用した場合の例外
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)
}
User.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)
UserRepository.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}")
}
}
そのユーザ名がNULL可能であるので、私は、ユーザーデータのクラスを変更する場合
org.springframework.data.mapping.model.MappingException: No property null found on entity class dsitest.User to bind constructor parameter to!
は、すべての作品:
テストKotlinIntegrationTest.persistenceTestを実行している、私はMongoDBのからユーザーオブジェクトを取得しようとすると、次のエラーメッセージが表示されます。
data class User @PersistenceConstructor constructor(@Id val id: String? = null,
val userName: String? = null)
私は、このような場合は、なぜ私は、ユーザ名がNULL可能にしたくないので、理解したいと思います。 Kotlinで私のUserクラスを定義するための代替方法がありますか?
多くのおかげで、 ダニエル
ありがとうRafal、大変感謝しています。私は完全に理解しているかわからない。なぜ、SpringはインストラクターをuserNameのnull値で呼び出すのですか?なぜ、データベースからロードしたuserNameを使用しないのですか? – Daniel
申し訳ありません(とLOL)私はそこに間違っているかもしれません...第二引数に@Fieldを追加してみてください:) –
これは受け入れられる回答でしょう! ( '@ JvmOverloads') –