当前使用版本(必须填写清楚,否则不予处理)

    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)
    }

重现步骤

  1. 建数据表 和 插入数据
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);
  1. 代码映射
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?
)

  1. 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的,如果不行看看是不是有装配类进行赋值