确认
当前程序版本
3.5.9
问题描述
使用背景:Springboot3.2.5, jdk17, mysql8, mybatis-plus3.5.9
问题描述:当应用内存在多个List<>类型的TypeHandler时,只有最先使用的那个TypeHandler会生效。
由于业务需要,数据库的多个表中存有多个List类型的序列化后json内容,这些字段对应不同的Java实体类,需要在查询的时候将json类型的内容反序列化为List<?>对象。
以下为我的实现方式:
- TypeHandler实现:
`@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(List.class)
public abstract class ListTypeHandler> {
@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);
}
} `
-
然后再对应的实体类中用TableField的typeHandler进行关联: @TableField(typeHandler = CheckoutOriginalListHandler.class) private List
originalInfoList; @TableField( typeHandler = ItemLeftAmountListHandler.class) private List leftInfoList; -
当我实现以上内容时,仅有应用启动后最先初始化的TypeHandler生效。 如果我先使用CheckoutOriginalListHandler相关的查询,则我在后续查询ItemLeftAmountListHandler的时候,字段会被反序列化为List
类型,反之亦然。
详细堆栈日志
No response
Comment From: miemieYaho
给出你的复现demo以git形式
Comment From: xutengx
同样的问题.
Comment From: flypiggy-stack
同样的问题,怎么解决呢?