聊城 網(wǎng)站制作新冠咳嗽一般要咳多少天
源碼:https://gitee.com/cao_wen_bin/test
最近在公司遇到了這樣一個(gè)為題,前端傳過(guò)來(lái)的是一個(gè)List<Manager>,往數(shù)據(jù)庫(kù)中保存到時(shí)候是String,這個(gè)String使用谷歌的json轉(zhuǎn)化器。
當(dāng)查詢的時(shí)候在將這個(gè)數(shù)據(jù)庫(kù)中String的數(shù)據(jù)以List<Manager>的形式返回給前端。
使用mapstruct中在怎樣將String轉(zhuǎn)化為L(zhǎng)ist。在此記錄一下。
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轉(zhuǎn)化為DTO,但是PO中的類(lèi)型是String,而DTO中的類(lèi)型是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.編寫(xiě)轉(zhuǎn)換代碼
因?yàn)槲沂鞘褂玫腉son把List<Manager>轉(zhuǎn)換為String,所以從String轉(zhuǎn)換為L(zhǎng)ist<Manager>也要用相同的json轉(zhuǎn)換,不然會(huì)出現(xiàn)異常
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轉(zhuǎn)為dto中的list*/public static List<Manager> strToList(String acctManagerListString) {if (StringUtils.isNotEmpty(acctManagerListString)) {// 將po中的acctManagerListString用Gson轉(zhuǎn)換成為list(必須和list轉(zhuǎn)String使用相同的轉(zhuǎn)換器)List<Manager> managerList = new Gson().fromJson(acctManagerListString, new TypeToken<List<Manager>>() {}.getType());return managerList;}return null;}/*** dto中的list轉(zhuǎn)為po中的String*/public static String listToStr(List<Manager> managerList) {if (!CollectionUtils.isEmpty(managerList)) {// 將dto中的acctManagerList用Gson轉(zhuǎn)換成為String(必須和String轉(zhuǎn)list使用相同的轉(zhuǎn)換器)String managerListString = new Gson().toJson(managerList);return managerListString;}return null;}}
}
4.測(cè)試代碼和測(cè)試
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轉(zhuǎn)為dto中的listpoString2DtoList();System.out.println("=====================");// dto中的list轉(zhuǎn)為po中的StringdtoList2PoString();}private static void dtoList2PoString() {List<Manager> managerList = new ArrayList<>();managerList.add(new Manager().setCode("0001").setName("管理員1號(hào)"));managerList.add(new Manager().setCode("0002").setName("管理員2號(hào)"));ManagerDTO managerDTO = new ManagerDTO().setId(3L).setAcctManagerList(managerList);log.info("managerDTO是: {}",managerDTO);ManagerPO managerPO = ManagerBeanConvert.INSTANCE.dto2Po(managerDTO);log.info("managerDTO轉(zhuǎn)換為managerPO結(jié)果是: {}",managerPO);}private static void poString2DtoList() {//設(shè)置List<Manager>List<Manager> managerList = new ArrayList<>();managerList.add(new Manager().setCode("0001").setName("管理員1號(hào)"));managerList.add(new Manager().setCode("0002").setName("管理員2號(hào)"));//使用Gson將list轉(zhuǎn)換成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轉(zhuǎn)換為managerDTO結(jié)果是: {}",managerDTO);}
}
5.改造
雖然上面的寫(xiě)法已經(jīng)可以滿足需求了,但是在ManagerBeanConvert接口中寫(xiě)內(nèi)部類(lèi)的話不規(guī)范,所以要修改。
新建一個(gè)專門(mén)的用于類(lèi)型屬性的轉(zhuǎn)換的類(lèi)AttributeConvertUtil,將接口中的內(nèi)部類(lèi)挪到這個(gè)新建的類(lèi)中,并在方法上面加上@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轉(zhuǎn)為dto中的list*/@Named("strToList")public List<Manager> strToList(String acctManagerListString) {if (StringUtils.isNotEmpty(acctManagerListString)) {// 將po中的acctManagerListString用Gson轉(zhuǎn)換成為list(必須和list轉(zhuǎn)String使用相同的轉(zhuǎn)換器)List<Manager> managerList = new Gson().fromJson(acctManagerListString, new TypeToken<List<Manager>>() {}.getType());return managerList;}return null;}/*** dto中的list轉(zhuǎn)為po中的String*/@Named("listToStr")public String listToStr(List<Manager> managerList) {if (!CollectionUtils.isEmpty(managerList)) {// 將dto中的acctManagerList用Gson轉(zhuǎn)換成為String(必須和String轉(zhuǎn)list使用相同的轉(zhuǎn)換器)String managerListString = new Gson().toJson(managerList);return managerListString;}return null;}
}
修改接口,
1.在@Mapper上引用我們的自定義轉(zhuǎn)換代碼類(lèi)AttributeConvertUtil
2.使用qualifiedByName指定我們使用的自定義轉(zhuǎn)換方法
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) //將自定義類(lèi)引入進(jìn)來(lái)
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