解析@TableName(autoResultMap = true) ,使用mybatis-plus自带方法,自定义的类型转换handler没有生效问题

张开发
2026/4/21 13:22:24 15 分钟阅读

分享文章

解析@TableName(autoResultMap = true) ,使用mybatis-plus自带方法,自定义的类型转换handler没有生效问题
文章目录报错分析解决方案报错org.mybatis.spring.MyBatisSystemException:nested exception isorg.apache.ibatis.executor.result.ResultMapException:Errorattemptingtogetcolumn activity_cover from resultset.Cause:com.fasterxml.jackson.databind.exc.MismatchedInputException:Cannotdeserialize value of type java.util.ArrayListjava.lang.Object fromObjectvalue(token JsonToken.START_OBJECT)at[Source:(String)[{filePath:/minio-file/jdy-rd-dev/infra-common/1.jpg,isCover:true},{filePath:/minio-file/jdy-rd-dev/infra-common/1.jpg,isCover:false}];line:1,column:2](through reference chain:java.util.ArrayList[0])分析很简单的通过没有mybatis-plus提供的raManger.getById(id)来查询竟然报错日了够了。虽然我实体的列List有点厉害但是我也指定ActivityCoverListTypeHandler了呀怎么还报错后来debug发现查询的时候根本没进来ActivityCoverListTypeHandler也就是说自定义的Handler没有生效于是在yml文件手动指定mybatis-plus:type-handlers-package:com.nimbus.common.mybatis.typehandler.common可是还是无效DataTableName(valuerecruit_activity)EqualsAndHashCode(callSupertrue)publicclassRecruitActivityEntityextendsAbstractProjectBasedEntity{/** * 活动封面. */TableField(valueactivity_cover,typeHandlerActivityCoverListTypeHandler.class)privateListActivityCoverVoactivityCover;}解决方案mybatis-plus需要对复杂类型的字段声明自动化结果集映射如果是xml就是自定义resultMap如果是使用mybatis自带的方法就需要实体类务必设置 autoResultMap true主要解决以下场景1、复杂类型字段映射自动为包含TableField(typeHandler XxxTypeHandler)的字段生成2、JSON/XML免配置避免手动编写标签特别适用于PostgreSQL的jsonb、几何类型等特殊字段DataTableName(valuerecruit_activity,autoResultMaptrue)EqualsAndHashCode(callSupertrue)publicclassRecruitActivityEntityextendsAbstractProjectBasedEntity{/** * 活动封面. */TableField(valueactivity_cover,typeHandlerActivityCoverListTypeHandler.class)privateListActivityCoverVoactivityCover;}

更多文章