kotlin - Spring JDBC - 带有 Kotlin 的 BeanPropertyRowMapper

标签 kotlin spring-jdbc

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

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

数据类:

enter image description here

存储库:

enter image description here

错误:

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 无法创建响应。

enter image description here 我还想知道这个问题是否只是 Java 反射特有的,以及 Spring 中的其他映射实用程序是否也是如此。

最佳答案

随着 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 的数据类没有无参数构造函数,也没有 setter(可以通过反编译来确认)。

所以你需要将字段定义为 var 并准备 no-arg 构造函数或使用 Kotlin no-arg 插件(这会破坏 null 安全性)。

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

关于kotlin - Spring JDBC - 带有 Kotlin 的 BeanPropertyRowMapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62864662/

相关文章:

android - 我应该将 .idea/assetWizardSettings.xml 添加到 gitignore 吗?

java - 使用 TextWatcher 的 EditText 动态掩码(用于血压单位)

spring - 如何在spring jdbc模板中将自动提交设置为false

kotlin - 如何将 Long 类型的范围与 lambda 表达式相乘

android - Room 库的 createFromAsset 和 fallbackToDestructiveMigration 方法 - 不存在数据

java - jdbcTemplate.queryForObject 在正常查询运行时返回 EmptyResultDataAccessException

java - 没有为 SQL 参数提供值,添加了 ']'

spring-mvc - Spring结果集提取器

java - Spring 框架将 Connection 对象传递给遗留代码

postgresql - 无法通过 JOOQ 使用 postgres 数组包含运算符正确构建查询