当前使用版本(必须填写清楚,否则不予处理)
implementation('com.alibaba:druid:1.1.3')
implementation("com.baomidou:mybatis-plus-boot-starter:3.0.5-SNAPSHOT") // 3.0.3 也试了
implementation('com.fasterxml.jackson.module:jackson-module-kotlin')
implementation('com.harium.hci:espeak:1.0.2')
implementation('org.jetbrains.kotlin:kotlin-stdlib-jdk8')
implementation('org.jetbrains.kotlin:kotlin-reflect')
implementation('org.springframework.boot:spring-boot-starter-jdbc')
implementation('org.springframework.boot:spring-boot-starter-thymeleaf')
implementation('org.springframework.boot:spring-boot-starter-webflux')
implementation('org.springframework.boot:spring-boot-starter-security')
runtimeOnly('mysql:mysql-connector-java')
// runtimeOnly('org.springframework.boot:spring-boot-devtools')
testImplementation('org.springframework.boot:spring-boot-starter-test')
testImplementation("org.springframework.security:spring-security-test")
testImplementation('io.projectreactor:reactor-test')
该问题是怎么引起的?(注意!!!请使用最新版(具体版本查看CHANGELOG.md),如还有该问题再提 issue!,否则直接拒绝,毫不商量!!!)
按流程正常添加枚举,运行单元测试就报错,原因是找不到有Int参数,这里已经用枚举代替了,可是不会自动映射,是不支持嘛?还是哪里配置错误,麻烦指正,文档那边看了很久,ISSUES也看了,排除了spring-boot-devtools的影响还是一样错误提示
@Test
fun testSelect() {
val userList = userMapper.selectList(null)
Assert.assertEquals(3, userList.size)
userList.forEach(::println)
}
重现步骤
- 建数据表 和 插入数据
CREATE TABLE IF NOT EXISTS `scheduling-system`.`user` (
`id` BIGINT(11) NOT NULL,
`username` VARCHAR(45) NULL,
`password` VARCHAR(68) NULL,
`name` VARCHAR(45) NULL,
`phone` BIGINT(11) NULL,
`wechat_id` VARCHAR(45) NULL,
`role` TINYINT NOT NULL DEFAULT 1,
PRIMARY KEY (`id`),
UNIQUE INDEX `wechat_id_UNIQUE` (`wechat_id` ASC),
UNIQUE INDEX `phone_UNIQUE` (`phone` ASC),
UNIQUE INDEX `username_UNIQUE` (`username` ASC))
ENGINE = InnoDB;
INSERT INTO `scheduling-system`.`user` (`id`, `username`, `password`, `name`, `phone`, `wechat_id`, `role`) VALUES (1, 'admin', '{noop}admin', '红尘忘', 11111111111, NULL, 4);
INSERT INTO `scheduling-system`.`user` (`id`, `username`, `password`, `name`, `phone`, `wechat_id`, `role`) VALUES (2, 'user', NULL, '张三', NULL, NULL, 1);
INSERT INTO `scheduling-system`.`user` (`id`, `username`, `password`, `name`, `phone`, `wechat_id`, `role`) VALUES (3, 'manager', 'manager', '李四', NULL, NULL, 2);
- 代码映射
package com.model.enums
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
enum class RoleEnum(private val value: Int, val desc: String) : IEnum<Int> {
USER(0b00000001, "用户"),
OPERATION_MANAGER(0b00000010, "业务经理"),
ADMIN(0b00000100, "管理员");
override fun getValue(): Int {
return this.value
}
}
package com.model
data class User(
@TableId(value = "id", type = IdType.AUTO)
val id: Long?,
val username: String?,
val password: String?,
val phone: Long?,
val wechatId: String?,
val role: RoleEnum?
)
- application.yml 配置
typeAliasesPackage: com.model
typeEnumsPackage: com.model.enums
报错信息
Caused by: org.apache.ibatis.executor.ExecutorException: No constructor found in com.model.User matching [java.lang.Long, java.lang.String, java.lang.String, java.lang.Long, java.lang.String, java.lang.Integer]
Comment From: keepcoolwu
没有类构造器
Comment From: craone
构造 @keepcoolwu kotlin data 自带构造器功能,如果换成
package com.model
data class User(
@TableId(value = "id", type = IdType.AUTO)
val id: Long?,
val username: String?,
val password: String?,
val phone: Long?,
val wechatId: String?,
val role: Int?
)
正常 构造
Comment From: miemieYaho
这你只有自己排查.java和kotlin来回切换尝试
Comment From: craone
构建之后,才进行反射赋值,所以将data类改成如下就OK了
package com.model
data class User(
@TableId(value = "id", type = IdType.AUTO)
val id: Long?=null,
val username: String?=null,
val password: String?=null,
val phone: Long?=null,
val wechatId: String?=null,
val role: RoleEnum?=null
)
PS:项目负责人真的是好勤劳哈 ; )
Comment From: SPARON
请问下楼主,这个需要其他配置么?怎么我遇到同样的问题,看了你的配置,还是一样没有解决查询出来映射枚举的问题。写入的时候是正确了的。
Comment From: craone
好久之前的项目了,有点忘了,不过 data 类必须默认赋空值,这样 Kotlin解析器会生成空constructor,枚举的话记得就是照搬JAVA的,如果不行看看是不是有装配类进行赋值