确认

  • [X] 我使用的版本是最新版, 并且使用插件确认过项目里无依赖版本冲突
  • [X] 我已经在 issue 中搜索过, 确认问题没有被提出过
  • [X] 我已经修改标题, 将标题中的 描述 替换为遇到的问题

当前程序版本

3.5.9

问题描述

使用背景:Springboot3.2.5, jdk17, mysql8, mybatis-plus3.5.9

问题描述:当应用内存在多个List<>类型的TypeHandler时,只有最先使用的那个TypeHandler会生效。

由于业务需要,数据库的多个表中存有多个List类型的序列化后json内容,这些字段对应不同的Java实体类,需要在查询的时候将json类型的内容反序列化为List<?>对象。

以下为我的实现方式:

  1. TypeHandler实现:

`@MappedJdbcTypes(JdbcType.VARCHAR) @MappedTypes(List.class) public abstract class ListTypeHandler implements TypeHandler> {

@Override
public void setParameter(PreparedStatement ps, int i, List<T> parameter, JdbcType jdbcType) throws SQLException {
    ps.setString(i, JsonUtils.toJson(parameter));
}

@Override
public List<T> getResult(ResultSet rs, String columnName) throws SQLException {
    return toListObject(rs.getString(columnName));
}

@Override
public List<T> getResult(ResultSet rs, int columnIndex) throws SQLException {
    return toListObject(rs.getString(columnIndex));
}

@Override
public List<T> getResult(CallableStatement cs, int columnIndex) throws SQLException {
    return toListObject(cs.getString(columnIndex));
}

protected abstract List<T> toListObject(String json);

}`

`@MappedJdbcTypes(JdbcType.VARCHAR) @MappedTypes(List.class) public class CheckoutOriginalListHandler extends ListTypeHandler {

@Override
protected List<WarehouseCheckout.OriginalInfo> toListObject(String json) {
    if(StringUtils.isBlank(json)){
        return null;
    }
    return JsonUtils.toObject(json, List.class, WarehouseCheckout.OriginalInfo.class);
}

}`

`@MappedJdbcTypes(JdbcType.VARCHAR) @MappedTypes(List.class) public class ItemLeftAmountListHandler extends ListTypeHandler {

@Override
protected List<ItemInfo.LeftAmountInfo> toListObject(String json) {
    if(StringUtils.isBlank(json)){
        return null;
    }
     return JsonUtils.toObject(json, List.class, ItemInfo.LeftAmountInfo.class);

}

} `

  1. 然后再对应的实体类中用TableField的typeHandler进行关联: @TableField(typeHandler = CheckoutOriginalListHandler.class) private List originalInfoList; @TableField( typeHandler = ItemLeftAmountListHandler.class) private List leftInfoList;

  2. 当我实现以上内容时,仅有应用启动后最先初始化的TypeHandler生效。 如果我先使用CheckoutOriginalListHandler相关的查询,则我在后续查询ItemLeftAmountListHandler的时候,字段会被反序列化为List类型,反之亦然。

详细堆栈日志

No response

Comment From: miemieYaho

给出你的复现demo以git形式

Comment From: xutengx

同样的问题.

Comment From: flypiggy-stack

同样的问题,怎么解决呢?