使用场景:
处理 domin 实体类与 model 类的属性映射的,我们只需定义 mapper 接口,mapstruct 在编译的时候就会自动的帮我们实现这个映射接口,避免了麻烦复杂的映射实现。【其实就是不同的对象不同的属性字段进行复制】
如果不使用工具的写法,需要一个个写:
import cn.xcewell.oms.entity.CdmbDocument;
import com.xcewell.oms.vo.MenuVo;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
/**
* 类型转换
*/
public class MenuAndCdmbConvert {
public static List<MenuVo> CdmbConvertMenu(List<? extends CdmbDocument> cdmbDocumentList){
List<MenuVo> menuVoList = new ArrayList<>();
cdmbDocumentList.stream().forEach(e->{
MenuVo menuVo = new MenuVo();
menuVo.setMenuCode(e.getCddm());
menuVo.setParentMenuCode(e.getFjdm());
menuVo.setMenuName(e.getCdmc());
menuVo.setMenuIcon(e.getTpdz());
menuVo.setAuthCode(e.getQxdm());
menuVo.setAuthName(e.getQxmc());
if(!CollectionUtils.isEmpty(e.getCdList())){
menuVo.setChildren(CdmbConvertMenu(e.getCdList()));
}
menuVoList.add(menuVo);
});
return menuVoList;
}
public static List<CdmbDocument> MenuConvertCdmb(List<? extends MenuVo> menuVoList){
List<CdmbDocument> cdmbDocumentList = new ArrayList<>();
menuVoList.stream().forEach(e->{
CdmbDocument cdmbVo = new CdmbDocument();
cdmbVo.setCddm(e.getMenuCode());
cdmbVo.setFjdm(e.getParentMenuCode());
cdmbVo.setCdmc(e.getMenuName());
cdmbVo.setTpdz(e.getMenuIcon());
cdmbVo.setQxdm(e.getAuthCode());
cdmbVo.setQxmc(e.getAuthName());
if(!CollectionUtils.isEmpty(e.getChildren())){
cdmbVo.setCdList(MenuConvertCdmb(e.getChildren()));
}
cdmbDocumentList.add(cdmbVo);
});
return cdmbDocumentList;
}
}
使用工具:
加入 maven 依赖
<dependency>
<groupId>org.mapstruct</groupId>
<!-- jdk8以下就使用mapstruct -->
<artifactId>mapstruct-jdk8</artifactId>
<version>1.2.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.2.0.Final</version>
</dependency>
import com.xcewell.oms.dto.Icons;
import lombok.Data;
import java.util.List;
/**
* 菜单模板参数
*/
@Data
public class CdmbDocument {
//菜单编号【前端生成】 -- 用于绑定常用菜单
private String cddm;
//父节点代码
private String fjdm;
//菜单名称
private String cdmc;
//显示的图片
private Icons tpdz;
//权限代码【节点代码】
private String qxdm;
//权限名称【节点代码】
private String qxmc;
//子节点
private List<CdmbDocument> cdList;
}
import com.xcewell.oms.dto.Icons;
import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.List;
/**
* APP 常用功能VO
*/
@Getter
@Setter
public class FavoriteVo {
private Integer count = 0;
private List<Data> list = new ArrayList<>();
public Data createData(){
return new Data();
}
public List<Data> createDataList(){
return this.list;
}
@Getter
@Setter
public static class Data{
//菜单编码
private String menuCode;
//菜单名称
private String menuName;
//菜单图标
private Icons menuIcon;
//关联功能权限编码
private String authCode;
}
}
这两个类转换:
import cn.xcewell.oms.entity.CdmbDocument;
import com.xcewell.oms.vo.FavoriteVo;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface FavoriteVoConvert {
FavoriteVoConvert INSTANCE = Mappers.getMapper(FavoriteVoConvert.class);
@Mappings({
@Mapping(source = "cddm", target = "menuCode"),
@Mapping(source = "cdmc", target = "menuName"),
@Mapping(source = "tpdz", target = "menuIcon"),
@Mapping(source = "qxdm", target = "authCode"),
})
FavoriteVo.Data convert(CdmbDocument cdmbDocument);
List<FavoriteVo.Data> convert(List<CdmbDocument> cdmbDocument);
}
CdmbDocument 转 FavoriteVo.Data
FavoriteVoConvert.INSTANCE.convert(cdmbDocument);
FavoriteVo.Data 转 CdmbDocument
FavoriteVoConvert.INSTANCE.convert(favoriteVo.Data);