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

mapstruct自定义转换,怎样将String转化为List

源码:https://gitee.com/cao_wen_bin/test
最近在公司遇到了这样一个为题,前端传过来的是一个List<Manager>,往数据库中保存到时候是String,这个String使用谷歌的json转化器。
当查询的时候在将这个数据库中String的数据以List<Manager>的形式返回给前端。
使用mapstruct中在怎样将String转化为List。在此记录一下。

1.引入依赖

<!--mapstruct-->
<dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>1.5.5.Final</version>
</dependency>
<dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>1.5.5.Final</version>
</dependency>

2.PO->DTO

package com.cao.pojo;import lombok.Data;
import lombok.ToString;
import lombok.experimental.Accessors;@Data
@Accessors(chain = true)
@ToString
public class Manager {private String name;private String code;
}

需求是将PO转化为DTO,但是PO中的类型是String,而DTO中的类型是List

ManagerPO中的acctManagerList属性是String

package com.cao.po;import lombok.Data;
import lombok.ToString;
import lombok.experimental.Accessors;@Data
@Accessors(chain = true)
@ToString
public class ManagerPO {private Long id;private String acctManagerListString;
}

ManagerDTO中的acctManagerList属性是List<Manager>

package com.cao.dto;import com.cao.pojo.Manager;
import lombok.Data;
import lombok.ToString;
import lombok.experimental.Accessors;import java.util.List;
@Data
@Accessors(chain = true)
@ToString
public class ManagerDTO {private Long id;private List<Manager> acctManagerList;
}

3.编写转换代码

因为我是使用的Gson把List<Manager>转换为String,所以从String转换为List<Manager>也要用相同的json转换,不然会出现异常

import com.cao.dto.ManagerDTO;
import com.cao.po.ManagerPO;
import com.cao.pojo.Manager;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.apache.commons.lang3.StringUtils;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;import java.util.List;@Mapper
public interface ManagerBeanConvert {ManagerBeanConvert INSTANCE = Mappers.getMapper(ManagerBeanConvert.class);@Mapping(target = "id", source = "id")@Mapping(target = "acctManagerList", expression = "java(MapStruct.strToList(managerPO.getAcctManagerListString()))")ManagerDTO po2Dto(ManagerPO managerPO);@Mapping(target = "id", source = "id")@Mapping(target = "acctManagerListString", expression = "java(MapStruct.listToStr(managerDTO.getAcctManagerList()))")ManagerPO dto2Po(ManagerDTO managerDTO);class MapStruct {/*** po中的String转为dto中的list*/public static List<Manager> strToList(String acctManagerListString) {if (StringUtils.isNotEmpty(acctManagerListString)) {// 将po中的acctManagerListString用Gson转换成为list(必须和list转String使用相同的转换器)List<Manager> managerList = new Gson().fromJson(acctManagerListString, new TypeToken<List<Manager>>() {}.getType());return managerList;}return null;}/*** dto中的list转为po中的String*/public static String listToStr(List<Manager> managerList) {if (!CollectionUtils.isEmpty(managerList)) {// 将dto中的acctManagerList用Gson转换成为String(必须和String转list使用相同的转换器)String managerListString = new Gson().toJson(managerList);return managerListString;}return null;}}
}

4.测试代码和测试

import com.cao.beanconvert.ManagerBeanConvert;
import com.cao.dto.ManagerDTO;
import com.cao.po.ManagerPO;
import com.cao.pojo.Manager;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;import java.util.*;
@Slf4j
public class BeanConvertTest {public static void main(String[] args) {// po中的String转为dto中的listpoString2DtoList();System.out.println("=====================");// dto中的list转为po中的StringdtoList2PoString();}private static void dtoList2PoString() {List<Manager> managerList = new ArrayList<>();managerList.add(new Manager().setCode("0001").setName("管理员1号"));managerList.add(new Manager().setCode("0002").setName("管理员2号"));ManagerDTO managerDTO = new ManagerDTO().setId(3L).setAcctManagerList(managerList);log.info("managerDTO是: {}",managerDTO);ManagerPO managerPO = ManagerBeanConvert.INSTANCE.dto2Po(managerDTO);log.info("managerDTO转换为managerPO结果是: {}",managerPO);}private static void poString2DtoList() {//设置List<Manager>List<Manager> managerList = new ArrayList<>();managerList.add(new Manager().setCode("0001").setName("管理员1号"));managerList.add(new Manager().setCode("0002").setName("管理员2号"));//使用Gson将list转换成StringString managerListString = new Gson().toJson(managerList);ManagerPO managerPO = new ManagerPO();managerPO.setId(1L).setAcctManagerListString(managerListString);log.info("managerPO是:{}",managerPO);ManagerDTO managerDTO = ManagerBeanConvert.INSTANCE.po2Dto(managerPO);log.info("managerPO转换为managerDTO结果是: {}",managerDTO);}
}

在这里插入图片描述

5.改造

虽然上面的写法已经可以满足需求了,但是在ManagerBeanConvert接口中写内部类的话不规范,所以要修改。
新建一个专门的用于类型属性的转换的类AttributeConvertUtil,将接口中的内部类挪到这个新建的类中,并在方法上面加上@Named(“别名”)

import com.cao.pojo.Manager;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.apache.commons.lang3.StringUtils;
import org.mapstruct.Named;
import org.springframework.util.CollectionUtils;import java.util.List;public class AttributeConvertUtil {/*** po中的String转为dto中的list*/@Named("strToList")public List<Manager> strToList(String acctManagerListString) {if (StringUtils.isNotEmpty(acctManagerListString)) {// 将po中的acctManagerListString用Gson转换成为list(必须和list转String使用相同的转换器)List<Manager> managerList = new Gson().fromJson(acctManagerListString, new TypeToken<List<Manager>>() {}.getType());return managerList;}return null;}/*** dto中的list转为po中的String*/@Named("listToStr")public String listToStr(List<Manager> managerList) {if (!CollectionUtils.isEmpty(managerList)) {// 将dto中的acctManagerList用Gson转换成为String(必须和String转list使用相同的转换器)String managerListString = new Gson().toJson(managerList);return managerListString;}return null;}
}

修改接口,
1.在@Mapper上引用我们的自定义转换代码类AttributeConvertUtil
2.使用qualifiedByName指定我们使用的自定义转换方法

import com.cao.dto.ManagerDTO;
import com.cao.po.ManagerPO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;@Mapper(uses = AttributeConvertUtil.class) //将自定义类引入进来
public interface ManagerBeanConvert {ManagerBeanConvert INSTANCE = Mappers.getMapper(ManagerBeanConvert.class);@Mapping(target = "id", source = "id")@Mapping(target = "acctManagerList", source = "acctManagerListString", qualifiedByName = "strToList")// qualifiedByName的值和别名一样ManagerDTO po2Dto(ManagerPO managerPO);@Mapping(target = "id", source = "id")@Mapping(target = "acctManagerListString", source = "acctManagerList", qualifiedByName = "listToStr") // qualifiedByName的值和别名一样ManagerPO dto2Po(ManagerDTO managerDTO);
}

源码:https://gitee.com/cao_wen_bin/test

相关文章:

mapstruct自定义转换,怎样将String转化为List

源码&#xff1a;https://gitee.com/cao_wen_bin/test 最近在公司遇到了这样一个为题&#xff0c;前端传过来的是一个List<Manager>,往数据库中保存到时候是String&#xff0c;这个String使用谷歌的json转化器。 当查询的时候在将这个数据库中String的数据以List<Mana…...

torch.matmul和torch.bmm区别

torch.matmul可用于4维数组的相乘&#xff0c;而torch.bmm只能用户3维数组的相乘&#xff0c;以/home/tiger/.local/lib/python3.9/site-packages/transformers/models/vit/modeling_vit.py中的ViTSelfAttention实现为例&#xff0c;在transpose_for_scores之前的shape是(batch…...

k8s学习(RKE+k8s+rancher2.x)成长系列之概念介绍(一)

一、前言 本文使用国内大多数中小型企业使用的RKE搭建K8s并拉起高可用Rancher2.x的搭建方式&#xff0c;以相关技术概念为起点&#xff0c;实际环境搭建&#xff0c;程序部署为终点&#xff0c;从0到1的实操演示的学习方式&#xff0c;一步一步&#xff0c;保姆级的方式学习k8…...

PHP - Yii2 异步队列

1. 前言使用场景 在 PHP Yii2 中&#xff0c;队列是一种特殊的数据结构&#xff0c;用于处理和管理后台任务。队列允许我们将耗时的任务&#xff08;如发送电子邮件、push通知等&#xff09;放入队列中&#xff0c;然后在后台异步执行。这样可以避免在处理大量请求时阻塞主应用…...

leetcode560和为k的子数组

class Solution { public:int subarraySum(vector<int>& nums, int k) {unordered_map<int,int>mp;mp[0]1;int count0,pre0;for(auto& x:nums){prex;if(mp.find(pre-k)!mp.end()){countmp[pre-k];}mp[pre];}return count;} }; 一个超级好的思路&#xff0…...

【ProtoBuf】使用指南

一.什么是ProtoBuf 特点&#xff1a;ProtoBuf是用于序列化和反序列化的一种方法&#xff0c;类似xml和json&#xff0c;但是效率更高&#xff0c;体积更小。ProtoBuf具有语⾔⽆关、平台⽆关&#xff0c;扩展性、兼容性好等特点。 ProtoBuf是需要依赖通过编译生成的头文件和源…...

Buffer Pool

Buffer Pool 概念free链表flush链表LRU链表chunk 概念 MySQL在启动时向操作系统申请的一片连续的内存&#xff0c;默认128M。然后将这块内存分为一个一个缓冲页(16KB&#xff0c;因为页就是16KB的)。再为每个缓冲页创建对应的控制块用于管理。比如第一次查询数据之后&#xff…...

jetson-inference----docker内运行分类任务

系列文章目录 jetson-inference入门 jetson-inference----docker内运行分类任务 文章目录 系列文章目录前言一、进入jetson-inference的docker二、分类任务总结 前言 继jetson-inference入门 一、进入jetson-inference的docker 官方运行命令 进入jetson-inference的docker d…...

Python脚本之操作Redis Cluster【二】

本文为博主原创&#xff0c;未经授权&#xff0c;严禁转载及使用。 本文链接&#xff1a;https://blog.csdn.net/zyooooxie/article/details/112484045 之前写过一篇 使用redis-py来操作redis集群&#xff0c; https://blog.csdn.net/zyooooxie/article/details/123760358 &am…...

认识数学建模

文章目录 1 什么是数学建模2 数学建模的比赛形式3 参加数学建模的好处4 数学建模的流程5 数学建模成员分工6 数学建模常用软件7 数学建模竞赛7.1 美国大学生数学建模竞赛7.2 MathorCup高校数学建模挑战赛7.3 华中杯大学生数学建模挑战赛7.4 认证杯数学建模网络挑战赛7.5 华东杯…...

计算机工作原理解析和解剖(基础版)

我们会从软件⼯程师的⻆度解释计算机是如何⼯作的&#xff0c;我们的主要⽬标既不是期待 ⼤家可以造出⾃⼰的计算机&#xff0c;也不是介绍如何编程&#xff0c;⽽是希望让⼤家了解计算机的核⼼⼯作机制后&#xff0c;打破计算机的神秘感&#xff0c;并且有利于理解我们平时编程…...

外网ssh远程连接服务器

文章目录 外网ssh远程连接服务器一、前言二、配置流程1. 在服务器上安装[cpolar](https://www.cpolar.com/)客户端2. 查看版本号&#xff0c;有正常显示版本号即为安装成功3. token认证4. 简单穿透测试5. 向系统添加服务6. 启动cpolar服务7. 查看服务状态8. 登录后台&#xff0…...

滴滴基于 Ray 的 XGBoost 大规模分布式训练实践

背景介绍 作为机器学习模型的核心代表&#xff0c;XGBoost 在滴滴众多策略算法业务场景中发挥着至关重要的作用。因此&#xff0c;保障并持续提升 XGBoost 模型的离线训练及在线推理稳定性一直是机器学习平台的重点工作。同时&#xff0c;面对多样化的业务场景定制需求和数据规…...

k8s从入门到实践

k8s从入门到实践 介绍 Kubernetes&#xff08;简称k8s&#xff09;和Docker Swarm是两个流行的容器编排工具&#xff0c;它们都可以帮助用户管理和部署分布式应用&#xff0c;尤其是基于容器的应用。以下是两者的主要特点和对比&#xff1a; Kubernetes (k8s)&#xff1a; 开…...

Qt5.12.0 与 VS2017 在 .pro文件转.vcxproj文件

一、参考资料 stackoverflow qt - How to generate .sln/.vcproj using qmake - Stack Overflowhttps://stackoverflow.com/questions/2339832/how-to-generate-sln-vcproj-using-qmake?answertabtrending#tab-topqt - 如何使用 qmake 生成 .sln/.vcproj - IT工具网 (coder.wo…...

金蝶云星空 ServiceGateway RCE漏洞复现

0x01 产品简介 金蝶云星空是一款云端企业资源管理(ERP)软件,为企业提供财务管理、供应链管理以及业务流程管理等一体化解决方案。金蝶云星空聚焦多组织,多利润中心的大中型企业,以 “开放、标准、社交”三大特性为数字经济时代的企业提供开放的 ERP 云平台。服务涵盖:财…...

二叉树的最大深度[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定一个二叉树root&#xff0c;返回其最大深度。 二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a…...

[Redis]不同系统间安装redis服务器

日常服务器端开发&#xff0c;消息队列等需求&#xff0c;免不了用到redis&#xff0c;搭建一个redis服务器&#xff0c;方便开发和测试&#xff0c;我们从以下三类系统来说明下&#xff1a; 安装 Redis 服务器的过程因操作系统而异。以下是在常见的 Linux 发行版&#xff08;…...

Unity之动画和角色控制

目录 &#x1f4d5; 一、动画 1.创建最简单的动画 2.动画控制器 &#x1f4d5;二、把动画和角色控制相结合 &#x1f4d5;三、实现实例 3.1 鼠标控制角色视角旋转 3.2 拖尾效果 &#x1f4d5;四、混合动画 最近学到动画了&#xff0c;顺便把之前创建的地形&#xff0…...

C语言库函数实现字符串转大小写

目录 引言 代码 引言 处理字符串时&#xff0c;除了将字符串中的所有大写字母转换为小写字母外&#xff0c;我们还可以利用其他相关函数进行更丰富的文本操作。本文将以一段使用isupper()、tolower()函数实现字符串全转小写的C语言程序为例&#xff0c;详细介绍这两个函数以及…...

5大维度重构Windows体验:开源系统优化方案全解析

5大维度重构Windows体验&#xff1a;开源系统优化方案全解析 【免费下载链接】Atlas &#x1f680; An open and lightweight modification to Windows, designed to optimize performance, privacy and security. 项目地址: https://gitcode.com/GitHub_Trending/atlas1/Atl…...

SVM支持向量机核函数选择避坑指南:从线性到RBF,如何根据你的数据特征做决定?

SVM核函数选择实战指南&#xff1a;从数据特征到模型调优的全流程解析 第一次在Scikit-learn中调用SVC类时&#xff0c;面对kernel参数下拉菜单里linear、poly、rbf、sigmoid四个选项&#xff0c;我盯着屏幕发了五分钟呆——这感觉就像走进一家高级餐厅&#xff0c;服务员递来一…...

MySQL视图实战:用SQL视图搞定学生奖学金评定与补考名单(附完整代码)

MySQL视图实战&#xff1a;用SQL视图搞定学生奖学金评定与补考名单&#xff08;附完整代码&#xff09; 教务管理系统中&#xff0c;数据处理效率直接影响决策质量。想象一下每学期末&#xff0c;教务处老师需要从数十万条记录中筛选奖学金候选人和补考名单——传统的手写SQL查…...

BiliTools:跨平台资源管理与高效解析的哔哩哔哩工具箱

BiliTools&#xff1a;跨平台资源管理与高效解析的哔哩哔哩工具箱 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持视频、音乐、番剧、课程下载……持续更新 项目地址: https://gitcode.com/GitHub_Trending/bilit/Bili…...

从智慧灯杆到无人驾驶:如何用Raspberry Pi 4和Arduino搭建微型智慧城市实验平台

从智慧灯杆到无人驾驶&#xff1a;如何用Raspberry Pi 4和Arduino搭建微型智慧城市实验平台 在创客文化和高校工程教育中&#xff0c;低成本硬件的创新应用正掀起一场微型智慧城市实验的革命。只需一块树莓派主板、几个传感器和开源软件&#xff0c;就能在桌面上复现价值数百万…...

nli-distilroberta-base实战案例:企业知识库问答系统中的逻辑一致性校验

nli-distilroberta-base实战案例&#xff1a;企业知识库问答系统中的逻辑一致性校验 1. 项目概述 在构建企业知识库问答系统时&#xff0c;确保回答与问题之间的逻辑一致性是一个关键挑战。nli-distilroberta-base是基于DistilRoBERTa模型的自然语言推理(NLI)服务&#xff0c…...

WebGLInput:重构Unity WebGL输入体验的革命性方案

WebGLInput&#xff1a;重构Unity WebGL输入体验的革命性方案 【免费下载链接】WebGLInput IME for Unity WebGL 项目地址: https://gitcode.com/gh_mirrors/we/WebGLInput 在Unity WebGL开发中&#xff0c;输入法支持一直是开发者面临的核心挑战之一。WebGLInput项目通…...

C++的std--ranges中的优化异构

C的std::ranges中的优化异构&#xff1a;现代编程的效率革命 C20引入的std::ranges库彻底改变了算法和容器的交互方式&#xff0c;其中优化异构&#xff08;Heterogeneous Optimization&#xff09;技术尤为引人注目。传统算法在处理不同类型的数据时&#xff0c;往往需要显式…...

BepInEx游戏插件加载器完全指南:从入门到精通Unity游戏扩展工具

BepInEx游戏插件加载器完全指南&#xff1a;从入门到精通Unity游戏扩展工具 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 如何用BepInEx解锁游戏自定义功能&#xff1f;解决玩家…...

终极指南:如何深度定制webMAN-MOD打造专属PS3游戏管家

终极指南&#xff1a;如何深度定制webMAN-MOD打造专属PS3游戏管家 【免费下载链接】webMAN-MOD Extended services for PS3 console (web server, ftp server, netiso, ntfs, ps3mapi, etc.) 项目地址: https://gitcode.com/gh_mirrors/we/webMAN-MOD 你是否曾为PS3游戏…...