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.hqwc.cn/news/342815.html

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

相关文章

Dart 空感知操作符:??

示例 写了如下代码&#xff1a; var str1 "hello"; var str2 "world"; var result str1 ?? str2.toUpperCase(); //如果str1不为空&#xff0c;则执行后面的语句 print(result); 代码可以正常执行&#xff0c;但是报了如下错误&#xff1a; Warnin…

【操作系统】重点概念汇总(手写版本)

Chapter1&#xff1a;操作系统引论 Chapter2&#xff1a;进程管理 Chapter3&#xff1a;处理机调度与死锁 Chapter4&#xff1a;存储器管理 Chapter5&#xff1a;虚拟存储器 Chapter6&#xff1a;输入输出系统 Chapter7&#xff1a;文件管理 Chapter8&#xff1a;磁盘存…

开放式蓝牙耳机学生党买哪款好?2024适合学生党入手的几款耳机分享

开放式耳机&#xff0c;就是那种不会把耳朵完全封闭起来的耳机&#xff0c;相比于封闭式耳机&#xff0c;开放式耳机有着更多的通风设计&#xff0c;长时间佩戴耳朵都不会疼痛&#xff0c;市面上涌现出许多适合学生党购买的开放式蓝牙耳机&#xff0c;那么如何选择一款性价比高…

如何进行有竞争力的SEO审计以超越行业竞争对手

许多营销人员都有兴趣密切关注竞争对手的搜索引擎优化 &#xff08;SEO&#xff09;。这是有道理的——无论你是刚开始做SEO&#xff0c;还是已经做了一段时间&#xff0c;你都希望对搜索引擎结果页面&#xff08;SERP&#xff09;的竞争格局有一个清晰的认识&#xff0c;这样你…

LeetCode 590. N 叉树的后序遍历

590. N 叉树的后序遍历 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 后序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [1,null,…

关于群晖ARPL界面能出现ip但是使用Synology Assistant搜索不到ip问题 及解决方法

文章引用ing304 频道文章&#xff1a;https://qun.qq.com/qqweb/qunpro/share?_wv3&_wwv128&appChannelshare&inviteCode20jx8dPsU2z&contentID1m4NKs&businessType2&from181174&shareSource5&bizka 前言 当进入该界面后 提示IP无法访问&a…

记录el-select+el-tree复选框,支持模糊查询,懒加载,树父子节点不关联,不全选

需求&#xff1a;一个机构下拉菜单&#xff0c;一个人员下拉菜单&#xff0c;默认带入当前登录用户的机构和人员。机构下拉菜单为两个接口&#xff0c;模糊查询为一个接口不包含懒加载&#xff0c;默认非模糊查询情况下为一个接口&#xff0c;点击节点懒加载。机构下拉菜单数据…

TOP 10 屏幕录制软件工具,可帮您轻松录制视频!

随着越来越多的人远程工作和学习&#xff0c;对可靠、高效的屏幕录制工具的需求变得越来越重要。屏幕录制已成为电子学习、游戏和视频创作的重要组成部分。然而&#xff0c;有这么多可用的屏幕录制工具&#xff0c;选择合适的工具可能具有挑战性。为了帮助您节省搜索时间和精力…

电商新趋势:解析养号的必要性及海外云手机运用攻略

在电商领域&#xff0c;什么最为关键&#xff1f;答案无疑是流量&#xff01;然而&#xff0c;如何以较低成本获取大量流量成为了许多电商从业者头疼的问题。虽然直接投放广告是一种方式&#xff0c;但在内卷的情况下效果越来越难以令人满意&#xff0c;高昂的广告费用也原来越…

【Docker】数据卷挂载以及宿主机目录挂载的使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Docker实战》。&#x1f3af;&#x1f3af; &…

MindOpt:阿里巴巴达摩院打造的优化求解器及其组件全面介绍

MindOpt 简介和获取 MindOpt 是阿里巴巴达摩院决策智能实验室研发的决策优化软件。团队组建于2019年&#xff0c;聚焦于研发尖端运筹优化和机器学习技术&#xff0c;构建智能决策系统&#xff0c;更快更好地向各行各业提供数学建模与求解能力&#xff0c;帮助业务更快更好地做…

open3d相关操作总结

open3d其实有很多交互式命令&#xff0c;在运行程序打开了open3d渲染的窗口后&#xff0c;鼠标点击窗口&#xff0c;按H就会弹出&#xff0c;交互命令的帮助&#xff0c;如下图所示&#xff1a; 其中比较常用的有&#xff1a; Q &#xff1a;退出当前窗口 H&#xff1a;打印帮…