使用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
相关产品推荐
相关产品推荐

