Spring JDBC - 使用 Kotlin 的 BeanPropertyRowMapper
Spring JDBC - BeanPropertyRowMapper with Kotlin
概览:
该应用程序处理用户信息的基本 CRUD 功能。
问题:
从预填充的 H2 数据库读取用户详细信息时,我在使用 BeanPropertyRowMapper
时遇到问题。
映射器无法初始化 User 实例,因为它无法使用数据的默认构造函数 class.
数据Class:
存储库:
错误:
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
提供特定的行映射器可以解决问题,但我很困惑为什么 BeanPropertyRowMapper
无法创建响应。
我还想知道这个问题是否仅特定于 Java 反射,以及这是否与 spring.
中的其他映射实用程序相同
随着对 SpringFramework 5.3
/SpringBoot 2.4
的更新,DataClassRowMapper
.
现在支持通过构造函数调用进行映射
我认为 KRowMapper
在功能方面有优势,但如果您不觉得使用外部库的痛苦,我建议使用 DataClassRowMapper
。
以下是旧答案
基本上,其他工具也会发生同样的事情。
Java 反射工具使用 no-arg 构造函数初始化实例,然后使用 setter 初始化字段。
另一方面,Kotlin 的数据 class 没有 no-arg 构造函数,也没有 setter (你可以通过反编译来确认)。
所以你需要将字段定义为var并准备no-arg构造函数或使用Kotlin no-arg插件(这会破坏空安全)。
我也遇到过同样的情况,所以我创建了一个基于 Kotlin 反射的工具。
如果你喜欢,请使用它。
https://github.com/ProjectMapK/KRowMapper
概览: 该应用程序处理用户信息的基本 CRUD 功能。
问题:
从预填充的 H2 数据库读取用户详细信息时,我在使用 BeanPropertyRowMapper
时遇到问题。
映射器无法初始化 User 实例,因为它无法使用数据的默认构造函数 class.
数据Class:
存储库:
错误:
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
提供特定的行映射器可以解决问题,但我很困惑为什么 BeanPropertyRowMapper
无法创建响应。
随着对 SpringFramework 5.3
/SpringBoot 2.4
的更新,DataClassRowMapper
.
我认为 KRowMapper
在功能方面有优势,但如果您不觉得使用外部库的痛苦,我建议使用 DataClassRowMapper
。
以下是旧答案
基本上,其他工具也会发生同样的事情。
Java 反射工具使用 no-arg 构造函数初始化实例,然后使用 setter 初始化字段。 另一方面,Kotlin 的数据 class 没有 no-arg 构造函数,也没有 setter (你可以通过反编译来确认)。
所以你需要将字段定义为var并准备no-arg构造函数或使用Kotlin no-arg插件(这会破坏空安全)。
我也遇到过同样的情况,所以我创建了一个基于 Kotlin 反射的工具。 如果你喜欢,请使用它。 https://github.com/ProjectMapK/KRowMapper