mybatisPlus 将List<String>字段转成json字符串,使用JacksonTypeHandler以及自定义类型处理器实现

文章目录

      • 场景
      • 使用JacksonTypeHandler实现类型转换
      • 自定义StringListTypeHandler处理器实现

场景

项目中经常需要将List转成json存储到配置文件中, mybatisPlus默认实现了JacksonTypeHandler,GsonTypeHandler,FastjsonTypeHandler,也可以自定义类型处理器。

使用JacksonTypeHandler实现类型转换

  1. DO维护@TableName(value = “system_oauth2_access_token”, autoResultMap = true), autoResultMap是需要显示设置的
  2. DO 指定字段维护@TableField(typeHandler = JacksonTypeHandler.class)
@TableName(value = "system_oauth2_access_token", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
@Builder
public class OAuth2AccessTokenDO extends BaseTenantDO {/*** 编号,数据库递增*/@TableIdprivate Long id;/*** 访问令牌*/private String accessToken;/*** 刷新令牌*/private String refreshToken;/*** 用户编号*/private Long userId;/*** 用户类型** 枚举 {@link UserTypeEnum}*/private Integer userType;/*** 客户端编号tong* 关联 {@link OAuth2ClientDO#getId()}*/private String clientId;/*** 授权范围*/
//    @TableField(typeHandler = StringListTypeHandler.class)@TableField(typeHandler = JacksonTypeHandler.class)private List<String> scopes;/*** 过期时间*/private LocalDateTime expiresTime;}

使用JacksonTypeHandler插入没有问题, 但是在查询时报错argument type mismatch, 跟踪代码发现是在org.apache.ibatis.reflection.factory.DefaultObjectFactory.instantiateClass()函数报错, 反射构造函数的时候实际入参是String, 而构造函数的入参设置成List。此时还没有到JacksonTypeHandler String to List的解析代码。没有找到解决方案,猜测跟mybatisPlus或者springboot版本有关系,可以试试换个版本

在这里插入图片描述

自定义StringListTypeHandler处理器实现

  1. DO类维护 autoResultMap = true
  2. DO类指定字段 指定类处理器 @TableField(typeHandler = StringListTypeHandler.class)
@TableName(value = "system_oauth2_access_token", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
@Builder
public class OAuth2AccessTokenDO extends BaseTenantDO {/*** 编号,数据库递增*/@TableIdprivate Long id;/*** 访问令牌*/private String accessToken;/*** 刷新令牌*/private String refreshToken;/*** 用户编号*/private Long userId;/*** 用户类型** 枚举 {@link UserTypeEnum}*/private Integer userType;/*** 客户端编号tong* 关联 {@link OAuth2ClientDO#getId()}*/private String clientId;/*** 授权范围*/@TableField(typeHandler = StringListTypeHandler.class)
//    @TableField(typeHandler = JacksonTypeHandler.class)private List<String> scopes;/*** 过期时间*/private LocalDateTime expiresTime;}
  1. 定义List泛型转换器
/*** @version V1.0* @author: carsonlius* @date: 2024/1/8 11:25* @company* @description List泛型处理器*/public abstract class ListTypeHandler<T> extends BaseTypeHandler<List<T>> {/*** 具体类型,由子类实现* @return 具体类型* */protected abstract Class<T> getType();@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, List<T> parameter, JdbcType jdbcType) throws SQLException {String context = CollectionUtils.isEmpty(parameter) ? null : JsonUtils.toJsonString(parameter);ps.setString(i, context);}@Overridepublic List<T> getNullableResult(ResultSet rs, String columnName) throws SQLException {return getResult(rs.getString( columnName));}@Overridepublic List<T> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return getResult(rs.getString( columnIndex));}@Overridepublic List<T> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return getResult(cs.getString( columnIndex));}/*** 根据json字符串格式化成List* */private List<T> getResult(String context) {return StrUtil.isBlank(context) ? new ArrayList<>() : JsonUtils.parseArray(context, getType());}
}
  1. 定义List子类
/*** @version V1.0* @author: carsonlius* @date: 2024/1/8 13:57* @company* @description List<String>和Json之间的转化*/
@MappedTypes(List.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class StringListTypeHandler extends ListTypeHandler<String> {@Overrideprotected Class<String> getType() {return String.class;}
}
  1. 注册类型处理器

mybatis-plus.type-handlers-package 用于指定扫描包的路径,以注册自定义的类型处理器(Type Handlers)

mybatis-plus.type-handlers-package: com.carsonlius.framework.mybatis.core.handler

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/607873.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA基础语句1

目录 前言 一.JAVA特性 简单 面向对象 分布式 多线程 二.关键字 三.对象和类 对象 类 构造方法 创建对象 访问实例变量和方法 源文件声明规则 Java 包 import 语句 总结 前言 这里参考了&#xff1a;Java 教程 | 菜鸟教程 (runoob.com) 第一个必须是&#xff1a; hello world&a…

Github 2024-01-09Python开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-01-09统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目10Jupyter Notebook项目1 Payloads All The Things - 有用的Web应用程序安全负载和绕过列表 创建…

带前后端H5即时通讯聊天系统源码

带有前后端的H5即时通讯聊天系统源码。该源码是一个开源的即时通信demo&#xff0c;需要前后端配合使用。它的主要目的是为了促进学习和交流&#xff0c;并为大家提供开发即时通讯功能的思路。尽管该源码提供了许多功能&#xff0c;但仍需要进行自行开发。该项目最初的开发初衷…

C#.Net学习笔记——CLR核心机制

一、CLR基本介绍 &#xff08;1&#xff09;C(Common) L&#xff08;Language&#xff09; R&#xff08;Runtime&#xff09; IL的运行环境 &#xff08;2&#xff09;从下图可以看到&#xff0c;我们的计算机会先把我们写的语言&#xff0c;编写成IL语言&#xff0c;再给计…

Gartner发布2024年SASE融合战略路线图

向云计算和远程工作的转变增加了 SASE 需求&#xff0c;以实现从任何设备的安全访问。安全和风险管理领导者必须将网络和安全融合到一两个明确合作的 SASE 供应商产品中&#xff0c;并淘汰遗留的边界系统。 主要发现 安全访问服务边缘 (SASE) 框架为混合劳动力以及设备、分支机…

java基础之HashMap练习题

应用了 外循环&#xff0c;自循环&#xff0c;Lambda表达式&#xff0c;keySet&#xff08;&#xff09;方法&#xff0c;values&#xff08;&#xff09;方法&#xff0c;Entry对象 &#xff0c;entrySet&#xff08;&#xff09;方法 Map集合框架 1:(Map)关于下列Map 接口中…

AI问答系统与对话机器人服务(一)

知识要点 微软认知服务中知识库服务的申请与搭建 如何用REST API访问知识库数据 微软认知服务中机器人服务的申请与搭建 如何无缝集成知识库服务与机器人服务 建立知识库 什么叫QnA Maker? 知识库&#xff0c;就是人们总结出的一些历史知识的集合&#xff0c;存储、索引…

Windows 双网卡链路聚合解决方案

Windows 双网卡链路聚合解决方案 链路聚合方案1&#xff1a;Metric介绍操作 方案2&#xff1a;NetSwitchTeam介绍操作 方案3&#xff1a;NIC介绍操作 方案4&#xff1a;Intel PROSet 链路聚合 指将多个物理端口汇聚在一起&#xff0c;形成一个逻辑端口&#xff0c;以实现出/入…

办公文档,私人专用

一、安装Minio 1.1、创建文件夹&#xff0c;并在指定文件夹中下载minio文件 cd /opt mkdir minio cd minio touch minio.log wget https://dl.minio.io/server/minio/release/linux-amd64/minio1.2、赋予minio文件执行权限 chmod 777 minio1.3、启动minio ./minio server /…

Python3+Selenium+Chrome实现自动填写WPS表单

引言 本文通过python3、第三方python库Selenium和谷歌浏览器Chrome&#xff0c;完成WPS表单的自动填写。 开发环境配置 python3的安装&#xff1a;略&#xff0c;网上都有教程。 Selenium的安装&#xff1a;在命令行输入pip3 install selenium并回车即可完成安装&#xff0c;如…

(Matlab)基于CNN-Bi_LSTM的多维时序回归预测(卷积神经网络-双向长短期记忆网络)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分代码展示&#xff1a; 四、完整代码数据下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平…

局域网IP地址冲突、环路的罪魁祸首是什么?

中午好&#xff0c;我的网工朋友。 这个时代&#xff0c;网络已经贯穿了人们的生活&#xff0c;对企业而言&#xff0c;办公信息化更是离不开网络支持。 为了提高安全管理和信息化水平&#xff0c;很多企业都建立了完善的办公信息系统&#xff0c;但一些企业在网络建设方面还…

适合培训协会搭建的培训机构管理系统开发方案

一、项目背景与目标 &#xff08;一&#xff09;项目背景 培训学校教务管理系统是培训机构数字化管理的必备系统&#xff0c;该系统功能大大提升机构办学的管理效率、提升机构在家长心中的专业度&#xff0c;市面上的培训机构管理系统收费越来越贵&#xff0c;为了给协会内培…

高功率电源PCB设计中变压器底层走线的关键要点

高功率电源的设计中&#xff0c;变压器起到了电能的传递与转换的重要作用。变压器下方的走线设计不仅涉及到电路的功率传输效率&#xff0c;还与电磁兼容性&#xff08;EMC&#xff09;、热管理以及电路的可靠性密切相关。 1. 走线布局 在进行变压器下方走线设计时&#xff0c…

Ubuntu 实时查看显存调用命令 free 及命令详解与原理说明(全)

Ubuntu 实时查看显存调用命令 free 及详解 文章目录 Ubuntu 实时查看显存调用命令 free 及详解1 free 作用1.1 语法&#xff1a;1.2 单独显示例子1.3 组合显示例子 2 输出介绍3 原理解释3.1 buff / cache&#xff08;即 buffer / cache&#xff09;3.1.1 buffer 缓冲区3.1.2 ca…

移动端对大批量图片加载的优化方法(二)

移动端对大批量图片加载的优化方法&#xff08;二&#xff09;Android 本篇主要从Android开发中可以使用到的对大批量图片加载的优化方法进行整理。 1.合适的图片格式 详情请参考移动端对大批量图片加载的优化方法&#xff08;一&#xff09;。 2.异步加载 图片加载可能会…

模板管理支持批量操作,DataEase开源数据可视化分析平台v2.2.0发布

2024年1月8日&#xff0c;DataEase开源数据可视化分析平台正式发布v2.2.0版本。 这一版本的功能升级包括&#xff1a;在“模板管理”页面中&#xff0c;用户可以通过模板管理的批量操作功能&#xff0c;对已有模板进行快速重新分类、删除等维护操作&#xff1b;数据大屏中&…

深圳易图讯科技VR三维电子沙盘系统

易图讯VR三维电子沙盘系统是一种结合虚拟现实技术的地理信息系统。它通过高精度三维模型&#xff0c;真实再现了地理环境、建筑布局和地形地貌。用户可通过VR设备沉浸式体验这一虚拟世界&#xff0c;进行各种交互操作&#xff0c;如缩放、旋转、移动等。系统还支持实时数据更新…

门店管理系统驱动智慧零售升级

在当今数字化经济的大潮中&#xff0c;实体门店正在经历一场由内而外的深度变革。门店管理系统以其高效、便捷和全面的功能特性&#xff0c;为实体店提供了高效的运营解决方案。 门店管理系统拜托了传统零售业对本地化软件的依赖&#xff0c;它将复杂的信息技术转化为易于获取…

2024十大开放式耳机品牌有哪些?公认好用的开放式耳机测评推荐

随着生活水平的提升&#xff0c;人们对音频设备的需求已经不再只是简单的声音输出&#xff0c;而是追求更高质量的听觉体验&#xff0c;而近几年出现的开放式耳机正是为了满足这一需求而诞生的&#xff0c;凭借着不入耳的设计带来了极致的佩戴体验&#xff0c;这种耳机也成为了…