Spring JDBC-带Kotlin的BeanPropertyRowMapper

Spring JDBC-带Kotlin的BeanPropertyRowMapper,kotlin,spring-jdbc,Kotlin,Spring Jdbc,概述: 该应用程序处理用户信息的基本CRUD功能 问题: 在从预填充的H2数据库读取用户详细信息时,我在使用BeanPropertyRowMapper时遇到了问题。 映射程序无法初始化用户实例,因为它无法使用数据类的默认构造函数 数据类: 存储库: 错误: 原因:java.lang.IllegalArgumentException:未为所需参数提供参数:参数#0乐趣id(kotlin.String、kotlin.String、kotlin.String、kotlin.String、java.

概述: 该应用程序处理用户信息的基本CRUD功能

问题: 在从预填充的H2数据库读取用户详细信息时,我在使用
BeanPropertyRowMapper
时遇到了问题。 映射程序无法初始化用户实例,因为它无法使用数据类的默认构造函数

数据类:

存储库:

错误:

原因:java.lang.IllegalArgumentException:未为所需参数提供参数:参数#0乐趣id(kotlin.String、kotlin.String、kotlin.String、kotlin.String、java.util.Date):org.chrysalis.userservice.model.User
提供一个特定的行映射器解决了这个问题,但我不明白为什么
BeanPropertyRowMapper
不能创建响应


我还想知道这个问题是否只针对Java反射,对于spring中的其他映射实用程序是否也是如此。

随着SpringFramework 5.3的更新,SpringBoot 2.4
DataClassRowMapper现在支持通过构造函数调用映射

我认为代码> KROMMAPPER <代码>在功能方面有优势,但是如果您不感到使用外部库的痛苦,我建议使用<代码> DATAcLasReWaveMeP< <代码> >


以下是一个古老的答案

基本上,其他工具也会发生同样的情况

Java反射工具使用无参数构造函数初始化实例,然后使用setter初始化字段。 另一方面,Kotlin的数据类没有arg构造函数和setter(您可以通过反编译来确认这一点)

因此,您需要将字段定义为var,并准备无参数构造函数或使用Kotlin无参数插件(这会破坏空安全性)

我也遇到了同样的问题,所以我创建了一个基于Kotlin反射的工具。 如果你喜欢,请用它。

Caused by: java.lang.IllegalArgumentException: No argument provided for a required parameter: parameter #0 id of fun <init>(kotlin.String, kotlin.String, kotlin.String, kotlin.String, java.util.Date): org.chrysalis.userservice.model.User