0


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

packagecom.cao.pojo;importlombok.Data;importlombok.ToString;importlombok.experimental.Accessors;@Data@Accessors(chain =true)@ToStringpublicclassManager{privateString name;privateString code;}

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

ManagerPO中的acctManagerList属性是String

packagecom.cao.po;importlombok.Data;importlombok.ToString;importlombok.experimental.Accessors;@Data@Accessors(chain =true)@ToStringpublicclassManagerPO{privateLong id;privateString acctManagerListString;}

ManagerDTO中的acctManagerList属性是List<Manager>

packagecom.cao.dto;importcom.cao.pojo.Manager;importlombok.Data;importlombok.ToString;importlombok.experimental.Accessors;importjava.util.List;@Data@Accessors(chain =true)@ToStringpublicclassManagerDTO{privateLong id;privateList<Manager> acctManagerList;}

3.编写转换代码

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

importcom.cao.dto.ManagerDTO;importcom.cao.po.ManagerPO;importcom.cao.pojo.Manager;importcom.google.gson.Gson;importcom.google.gson.reflect.TypeToken;importorg.apache.commons.lang3.StringUtils;importorg.mapstruct.Mapper;importorg.mapstruct.Mapping;importorg.mapstruct.factory.Mappers;importjava.util.List;@MapperpublicinterfaceManagerBeanConvert{ManagerBeanConvert INSTANCE =Mappers.getMapper(ManagerBeanConvert.class);@Mapping(target ="id", source ="id")@Mapping(target ="acctManagerList", expression ="java(MapStruct.strToList(managerPO.getAcctManagerListString()))")ManagerDTOpo2Dto(ManagerPO managerPO);@Mapping(target ="id", source ="id")@Mapping(target ="acctManagerListString", expression ="java(MapStruct.listToStr(managerDTO.getAcctManagerList()))")ManagerPOdto2Po(ManagerDTO managerDTO);classMapStruct{/**
         * po中的String转为dto中的list
         */publicstaticList<Manager>strToList(String acctManagerListString){if(StringUtils.isNotEmpty(acctManagerListString)){// 将po中的acctManagerListString用Gson转换成为list(必须和list转String使用相同的转换器)List<Manager> managerList =newGson().fromJson(acctManagerListString,newTypeToken<List<Manager>>(){}.getType());return managerList;}returnnull;}/**
         * dto中的list转为po中的String
         */publicstaticStringlistToStr(List<Manager> managerList){if(!CollectionUtils.isEmpty(managerList)){// 将dto中的acctManagerList用Gson转换成为String(必须和String转list使用相同的转换器)String managerListString =newGson().toJson(managerList);return managerListString;}returnnull;}}}

4.测试代码和测试

importcom.cao.beanconvert.ManagerBeanConvert;importcom.cao.dto.ManagerDTO;importcom.cao.po.ManagerPO;importcom.cao.pojo.Manager;importcom.google.gson.Gson;importlombok.extern.slf4j.Slf4j;importjava.util.*;@Slf4jpublicclassBeanConvertTest{publicstaticvoidmain(String[] args){// po中的String转为dto中的listpoString2DtoList();System.out.println("=====================");// dto中的list转为po中的StringdtoList2PoString();}privatestaticvoiddtoList2PoString(){List<Manager> managerList =newArrayList<>();
        managerList.add(newManager().setCode("0001").setName("管理员1号"));
        managerList.add(newManager().setCode("0002").setName("管理员2号"));ManagerDTO managerDTO =newManagerDTO().setId(3L).setAcctManagerList(managerList);
        log.info("managerDTO是: {}",managerDTO);ManagerPO managerPO =ManagerBeanConvert.INSTANCE.dto2Po(managerDTO);
        log.info("managerDTO转换为managerPO结果是: {}",managerPO);}privatestaticvoidpoString2DtoList(){//设置List<Manager>List<Manager> managerList =newArrayList<>();
        managerList.add(newManager().setCode("0001").setName("管理员1号"));
        managerList.add(newManager().setCode("0002").setName("管理员2号"));//使用Gson将list转换成StringString managerListString =newGson().toJson(managerList);ManagerPO managerPO =newManagerPO();
        managerPO.setId(1L).setAcctManagerListString(managerListString);
        log.info("managerPO是:{}",managerPO);ManagerDTO managerDTO =ManagerBeanConvert.INSTANCE.po2Dto(managerPO);
        log.info("managerPO转换为managerDTO结果是: {}",managerDTO);}}

在这里插入图片描述

5.改造

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

importcom.cao.pojo.Manager;importcom.google.gson.Gson;importcom.google.gson.reflect.TypeToken;importorg.apache.commons.lang3.StringUtils;importorg.mapstruct.Named;importorg.springframework.util.CollectionUtils;importjava.util.List;publicclassAttributeConvertUtil{/**
     * po中的String转为dto中的list
     */@Named("strToList")publicList<Manager>strToList(String acctManagerListString){if(StringUtils.isNotEmpty(acctManagerListString)){// 将po中的acctManagerListString用Gson转换成为list(必须和list转String使用相同的转换器)List<Manager> managerList =newGson().fromJson(acctManagerListString,newTypeToken<List<Manager>>(){}.getType());return managerList;}returnnull;}/**
     * dto中的list转为po中的String
     */@Named("listToStr")publicStringlistToStr(List<Manager> managerList){if(!CollectionUtils.isEmpty(managerList)){// 将dto中的acctManagerList用Gson转换成为String(必须和String转list使用相同的转换器)String managerListString =newGson().toJson(managerList);return managerListString;}returnnull;}}

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

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

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

标签: java maven mapstruct

本文转载自: https://blog.csdn.net/weixin_44137201/article/details/135836888
版权归原作者 子沫2020 所有, 如有侵权,请联系我们删除。

“mapstruct自定义转换,怎样将String转化为List”的评论:

还没有评论