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

报错

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'activity_cover' from result set.  Cause: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.util.ArrayList<java.lang.Object>` from Object value (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

可是还是无效!!!

@Data
@TableName(value = "recruit_activity")
@EqualsAndHashCode(callSuper = true)
public class RecruitActivityEntity extends AbstractProjectBasedEntity {
    /**
     * 活动封面.
     */
    @TableField(value = "activity_cover", typeHandler = ActivityCoverListTypeHandler.class)
    private List<ActivityCoverVo> activityCover;
}

解决方案

mybatis-plus需要对复杂类型的字段声明自动化结果集映射,如果是xml就是自定义resultMap,如果是使用mybatis自带的方法,就需要实体类务必设置 autoResultMap = true
主要解决以下场景:
1、复杂类型字段映射:自动为包含@TableField(typeHandler = XxxTypeHandler)的字段生成
2、JSON/XML免配置:避免手动编写标签,特别适用于PostgreSQL的jsonb、几何类型等特殊字段

@Data
@TableName(value = "recruit_activity", autoResultMap = true)
@EqualsAndHashCode(callSuper = true)
public class RecruitActivityEntity extends AbstractProjectBasedEntity {
    /**
     * 活动封面.
     */
    @TableField(value = "activity_cover", typeHandler = ActivityCoverListTypeHandler.class)
    private List<ActivityCoverVo> activityCover;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员码小跳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值