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

2024-01-26 10:04

本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/646448

相关文章

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义