当前位置: 首页 > article >正文

【实战场景】java.util.LinkedHashMap cannot be cast to XXXX 问题

【实战场景】java.util.LinkedHashMap cannot be cast to XXXX 问题

  • 一.报错背景
  • 二.错误剖析
  • 三.解决方案
      • 方案一
        • 1.导入依赖:
        • 2.类型转换:
      • 方案二
        • 1.公共的ListTypeHandler
        • 2.具体的ListTypeHandler
    • 我是杰叔叔,一名沪漂的码农,下期再会!

一.报错背景

在使用mybatisPlus读取mysql的表的一个json字段,然后这个json对应的是java list 【List】,转化的时候抛了这个异常!

二.错误剖析

在这里插入图片描述
mybatisPlus的注解@TableField种指定的typeHandler如果使用 JacksonTypeHandler的话,会默认将数据库json字段映射成List,然后List中便是 LinkedHashMap, 《.》真的是遭重呀~~~~

三.解决方案

在这里插入图片描述

方案一

1.导入依赖:
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
2.类型转换:
 List<T> records = result.getData().getList();
  //使用ObjectMapper解决
  //创建一个ObjectMapper
  ObjectMapper mapper = new ObjectMapper();
  //OperLog就是需要的类型对象
  List<OperLog> operLogs= mapper.convertValue(records, new TypeReference<List<OperLog>>() {});

方案二

1.公共的ListTypeHandler
提供一个 JSONArray 转换为 Java List集合的处理器
@MappedJdbcTypes指定jdbc的类型
@MappedTypes指定Java的类型

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
 
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; 

@MappedJdbcTypes(JdbcType.ARRAY)
@MappedTypes({List.class})
public abstract class ListTypeHandler<T> extends BaseTypeHandler<List<T>>
{
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, List<T> parameter, JdbcType jdbcType) throws SQLException {
        String content = CollUtil.isEmpty(parameter) ? null : JSON.toJSONString(parameter);
        ps.setString(i, content);
    }

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

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

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

    private List<T> getListByJsonArrayString(String content) {
        return StrUtil.isBlank(content) ? new ArrayList<>() : JSON.parseObject(content, this.specificType());
    }

    /**
     * 具体类型,由子类提供
     *
     * @return 具体类型
     */
    protected abstract TypeReference<List<T>> specificType();
}
2.具体的ListTypeHandler

由具体的子类提供List集合泛型类型

import com.alibaba.fastjson.TypeReference;
import com.chandol.entity.po.ReportUser;
import java.util.List;  

public class ReportUserListTypeHandler extends ListTypeHandler<ReportUser> { 
    @Override
    protected TypeReference<List<ReportUser>> specificType() {
        return new TypeReference<List<ReportUser>>() {
        };
    }    
}

在这里插入图片描述

我是杰叔叔,一名沪漂的码农,下期再会!


http://www.kler.cn/news/363116.html

相关文章:

  • Flutter仿京东商城APP实战 用户中心基础布局
  • 详解如何使用WGCLOUD监测日志文件
  • 初学者如何学习网络安全,零基础入门到精通,收藏这一篇就够了
  • HttpOnly Cookie
  • shell脚本-函数
  • 报表工具怎么选?山海鲸VS帆软,哪个更适合你?
  • 私域小程序怎么运营,如何引流?(二)
  • 基于MATLAB车道检测与跟踪
  • 《计算机视觉》—— 换脸
  • 背景音乐自动播放createjs
  • keepalived(高可用)+nginx(负载均衡)+web
  • 在 Spring 框架中,@ComponentScan` 扫描的注解类型
  • MissingSemester-版本控制系统Git
  • 讯飞、阿里云、腾讯云:Android 语音合成服务对比选择
  • 计算机网络——可靠数据传输原理
  • [Git]一文速通
  • 13图书归还-云图书管理系统(Vue3+Spring Boot+element plus)
  • Visual Basic介绍及简单例子
  • LabVIEW提高开发效率技巧----节省内存
  • 23种设计模式口诀速记
  • FPGA采集adc,IP核用法,AD驱动(上半部分)
  • 判断路径是否存在os.path.lexists(path)
  • ORA-12170: TNS:Connect timeout occurred
  • Vue Google 广告的配置
  • Kafka、Kafka Streams、Drools、Redis 和分布式数据库的风控系统程序
  • 应用程序性能优化:从操作系统到算法的全方位攻略