You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Lombok与MyBatis时,含成员对象的Task类映射枚举报错

问题分析与解决方案

核心问题:MyBatis在映射返回结果时,错误地将自动生成的ID值(2)尝试转换为PayloadType枚举,导致枚举转换失败。这说明映射逻辑出现了字段关联混乱。

可能的原因及修复方案

1. ResultMap类型不匹配

检查taskPayloadMap的type属性是否与Task类中payload字段的实际类型完全一致。比如你代码中Task的payload是com.prod.transponder.entity.TaskPayload,但taskPayloadMap的type写的是com.prod.transponder.model.TaskPayload,类型不匹配会导致MyBatis无法正确解析字段映射,进而出现混乱。

修复:
修改taskPayloadMap的type为Task类中payload字段的实际全限定类名:

<resultMap id="taskPayloadMap" type="com.prod.transponder.entity.TaskPayload">
    <result column="payload_encoding" property="payloadEncoding" />
    <result column="payload_type" property="payloadType"/>
    <result column="payload_text" property="data"/>
</resultMap>

2. Lombok @Builder导致构造器映射顺序错误

@Builder注解会生成全参构造器,MyBatis默认优先使用构造器进行结果映射。如果数据库返回的列顺序与构造器参数顺序不匹配,就会出现参数赋值错误——比如把ID值错误传递给TaskPayload构造器的第一个参数payloadType。

修复:

  • 给实体类添加无参和全参构造器,让MyBatis使用setter方法映射:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Task {
    private int id;
    private TaskPayload payload;
    // 省略其他成员
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TaskPayload {
    private PayloadType payloadType;
    private PayloadEncoding payloadEncoding;
    private String data;
}
  • 或者在ResultMap中禁用自动映射,强制使用显式配置:
<resultMap id="taskResultMap" type="com.prod.transponder.entity.Task" autoMapping="false">
    <id column="id" property="id"/>
    <association property="payload" resultMap="taskPayloadMap"/>
</resultMap>

<resultMap id="taskPayloadMap" type="com.prod.transponder.entity.TaskPayload" autoMapping="false">
    <result column="payload_encoding" property="payloadEncoding" />
    <result column="payload_type" property="payloadType"/>
    <result column="payload_text" property="data"/>
</resultMap>

3. 枚举类型处理器全局配置冲突

如果全局配置了枚举类型处理器(比如EnumOrdinalTypeHandler),可能会错误地应用到非枚举类型的字段(如int类型的id),导致MyBatis尝试将ID数值转换为枚举。

修复:

  • 移除全局枚举处理器配置,改为在枚举字段上单独指定类型处理器:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TaskPayload {
    @TypeHandler(EnumTypeHandler.class)
    private PayloadType payloadType;
    @TypeHandler(EnumTypeHandler.class)
    private PayloadEncoding payloadEncoding;
    private String data;
}
  • 确保数据库中payload_type、payload_encoding字段存储的是枚举名称字符串(而非数字),匹配MyBatis默认的EnumTypeHandler处理逻辑。

内容的提问来源于stack exchange,提问作者mig001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:02:02