Spring JDBC - BeanPropertyRowMapper 与 Kotlin

Dha*_*ari 3 spring-jdbc kotlin

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

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

数据类:

在此处输入图片说明

存储库:

在此处输入图片说明

错误:

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
Run Code Online (Sandbox Code Playgroud)

提供特定的行映射器可以解决该问题,但我很困惑为什么BeanPropertyRowMapper无法创建响应。

在此处输入图片说明 我还想知道这个问题是否只特定于 Java 反射,以及这对于 spring 中的其他映射实用程序是否相同。

wro*_*ong 8

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

https://spring.pleiades.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/core/DataClassRowMapper.html

我认为KRowMapper在功能方面有优势,但如果你不觉得使用外部库的痛苦,我建议使用DataClassRowMapper.


以下是旧答案。

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

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

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

同样的情况我也遇到了麻烦,所以我创建了一个基于 Kotlin 反射的工具。如果您愿意,请使用它。 https://github.com/ProjectMapK/KRowMapper