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

3.2.0

该问题是怎么引起的?(最新版上已修复的会直接close掉)

  • 在实体类的枚举字段上添加注解:@TableField(typeHandler = MybatisEnumTypeHandler.class), 查询修改操作均会报错,仅新增可以成功。typeHandler 为mybatis自带的EnumOrdinalTypeHandler时,也会报错,貌似被解析为object对象。(枚举类按照官网配置已添加@EnumValue注解)
  • 目前使用的方法:不在枚举字段上添加typeHandler 的注解,使用typeEnumsPackage参数配置枚举类扫描路径

重现步骤

报错信息

  • typeHandler = MybatisEnumTypeHandler.class

    Caused by: org.apache.ibatis.type.TypeException: Failed invoking constructor for handler class com.baomidou.mybatisplus.extension.handlers.MybatisEnumTypeHandler Caused by: java.lang.reflect.InvocationTargetException Caused by: java.lang.IllegalArgumentException: Could not find @EnumValue in Class: java.lang.Object.

  • typeHandler = EnumOrdinalTypeHandler.class

    Caused by: org.apache.ibatis.type.TypeException: Failed invoking constructor for handler class org.apache.ibatis.type.EnumOrdinalTypeHandler Caused by: java.lang.reflect.InvocationTargetException Caused by: java.lang.IllegalArgumentException: Object does not represent an enum type.

Comment From: miemieYaho

  • Could not find @EnumValue in Class: java.lang.Object
  • Object does not represent an enum type.

Comment From: bert82503

建议提供完整的解决方法,说明问题根因,避免重复踩坑。

自动映射枚举 https://baomidou.com/guides/auto-convert-enum/

2024

2141

Could not find @EnumValue in Class: java.lang.Object.

Comment From: bert82503

按照官方文档,确实解决了

自动映射枚举 https://baomidou.com/guides/auto-convert-enum/

声明通用枚举属性 方式一:使用 @EnumValue 注解枚举属性

配置 MyBatis-Plus 自动映射枚举 方式二:全局修改 DefaultEnumTypeHandler

MyBatis-Plus @TableField的typeHandler参数为枚举类typeHandler时报错

MyBatis-Plus @TableField的typeHandler参数为枚举类typeHandler时报错

InterfaceCacheConfigDo

import java.time.LocalDateTime;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.lefit.gateway.admin.client.model.EnableStateEnum;
import com.lefit.gateway.admin.client.model.EnvironmentTagEnum;
import lombok.Data;

/**
 * 接口缓存配置【数据对象】
 *
 * @since 2024/5/17
 */
@Data
@TableName(value = "t_api_interface_cache_config", autoResultMap = true)
public class InterfaceCacheConfigDo {
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    // ...

    /**
     * 环境标签,1-开发环境,2-测试环境,3-预发环境,4-生产环境
     */
    @TableField(value = "environment_tag")
    private EnvironmentTagEnum environmentTag;

    /**
     * 启用状态,0-未启用,1-启用
     */
    @TableField(value = "enable_status")
    private EnableStateEnum enableStatus;

    // ...

    /**
     * 创建时间
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}

EnvironmentTagEnum

import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 环境标签
 *
 * @since 2024/5/17
 */
@Getter
@AllArgsConstructor
public enum EnvironmentTagEnum {
    /**
     * 开发环境
     */
    DEVELOP_ENV(0),
    /**
     * 测试环境
     */
    TEST_ENV(1),
    /**
     * 预发环境
     */
    STAGING_ENV(2),
    /**
     * 生产环境
     */
    PRODUCTION_ENV(3),
    ;

    /**
     * 标记数据库存的值是code
     */
    @EnumValue
    private final int code;
}

EnableStateEnum

import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 启用状态
 *
 * @since 2024/5/17
 */
@Getter
@AllArgsConstructor
public enum EnableStateEnum {
    /**
     * 未启用
     */
    NOT_ENABLE(0),
    /**
     * 启用
     */
    ENABLE(1),
    ;

    /**
     * 标记数据库存的值是code
     */
    @EnumValue
    private final int code;
}

application.properties

mybatis-plus.configuration.default-enum-type-handler=com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler