场景:我调用的下游服务返回的参数命名是拼音首字母,而我返回给第三方的需要是英文命名。故需两个实体类字段完全不一样赋值 (不想用get 在 set)
MapStruct特点
- 基于注解
- 在编译期自动生成映射转换代码
- 类型安全、高性能、无依赖性
实现:
1. 引入 jar 包依赖
<properties>
<!--第三方依赖-->
<mapstruct.version>1.5.3.Final</mapstruct.version>
<lombok-mapstruct.version>0.2.0</lombok-mapstruct.version>
<lombok.version>1.18.24</lombok.version>
</properties>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<!--mapstruct编译 必要 需要编译mapstruct实现类-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<!--引入mapstruct 如果lombok版本>= 1.18.16则需要如下配置 我的lombok版本是1.18.24-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${lombok-mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
2. 创建映射器类(该@Mapper注解将使得MapStruct代码生成器 生成一个实现类, Mappers.getMapper则是得到该实现类的实例)
实体类:
/**
* 目标实体
*
*/
@Data
public class SchoolVO {
/**
* 学校编码
*/
@ApiModelProperty("学校编码")
private String code;
/**
* 学校名称
*/
@ApiModelProperty("学校名称")
private String name;
}
/**
* 源实体
*
*/
@Data
public class xxbmVO {
/**
* 学校编码
*/
@ApiModelProperty("学校编码")
private String xxbm;
/**
* 学校名称
*/
@ApiModelProperty("学校名称")
private String xxmc;
}
package com.cunw.cloud.dataworks.openplatform.converters.vo;
import com.cunw.cloud.dataworks.common.vo.openplatform.SchoolVO;
import com.cunw.framework.vo.PageList;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import vo.ThreeDSchoolListVO;
import java.util.List;
/**
* * @description: 学校实体类转换器 类
* * @author:
* * @create: 2022/12/17 10:19
*/
@Mapper
public interface SchoolMapper {
SchoolMapper INSTANCT = Mappers.getMapper(SchoolMapper.class);
/**
* 转换单个对象
* @param school
* @return
*/
@Mapping(target = "code", source = "xxbm")
@Mapping(target = "name", source = "xxmc")
SchoolVO cover(ThreeDSchoolListVO school);
/**
* 转换多个对象
* @param schoolListVOS
* @return
*/
List<SchoolVO> coverList(List<ThreeDSchoolListVO> schoolListVOS);
/**
* 转换多个对象(PageList)
* @param voPageList
* @return
*/ PageList<SchoolVO>coverPage(com.cunw.cloud.framework.service.pagehelper.PageList<ThreeDSchoolListVO> voPageList);
}
打开实现类看一下(实体类源码在 target/generated-sources/annotations
目录下)
coverList实际上就是调用单个对象的cover
PageList方法调用coverList方法
package com.cunw.cloud.dataworks.openplatform.converters.vo;
import com.cunw.cloud.dataworks.common.vo.openplatform.SchoolVO;
import com.cunw.framework.vo.PageList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.annotation.Generated;
import vo.ThreeDSchoolListVO;
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2022-12-26T09:32:19+0800",
comments = "version: 1.5.3.Final, compiler: javac, environment: Java 1.8.0_291 (Oracle Corporation)"
)
public class SchoolMapperImpl implements SchoolMapper {
@Override
public SchoolVO cover(ThreeDSchoolListVO school) {
if ( school == null ) {
return null;
}
SchoolVO schoolVO = new SchoolVO();
schoolVO.setCode( school.getXxbm() );
schoolVO.setName( school.getXxmc() );
return schoolVO;
}
@Override
public List<SchoolVO> coverList(List<ThreeDSchoolListVO> schoolListVOS) {
if ( schoolListVOS == null ) {
return null;
}
List<SchoolVO> list = new ArrayList<SchoolVO>( schoolListVOS.size() );
for ( ThreeDSchoolListVO threeDSchoolListVO : schoolListVOS ) {
list.add( cover( threeDSchoolListVO ) );
}
return list;
}
@Override
public PageList<SchoolVO> coverPage(com.cunw.cloud.framework.service.pagehelper.PageList<ThreeDSchoolListVO> voPageList) {
if ( voPageList == null ) {
return null;
}
PageList<SchoolVO> pageList = new PageList<SchoolVO>();
pageList.setTotal( voPageList.getTotal() );
pageList.setList( coverList( voPageList.getList() ) );
pageList.setPageNum( voPageList.getPageNum() );
pageList.setPageSize( voPageList.getPageSize() );
pageList.setSize( voPageList.getSize() );
pageList.setStartRow( voPageList.getStartRow() );
pageList.setEndRow( voPageList.getEndRow() );
pageList.setPages( voPageList.getPages() );
pageList.setPrePage( voPageList.getPrePage() );
pageList.setNextPage( voPageList.getNextPage() );
pageList.setIsFirstPage( voPageList.isIsFirstPage() );
pageList.setIsLastPage( voPageList.isIsLastPage() );
pageList.setHasPreviousPage( voPageList.isHasPreviousPage() );
pageList.setHasNextPage( voPageList.isHasNextPage() );
pageList.setNavigatePages( voPageList.getNavigatePages() );
int[] navigatepageNums = voPageList.getNavigatepageNums();
if ( navigatepageNums != null ) {
pageList.setNavigatepageNums( Arrays.copyOf( navigatepageNums, navigatepageNums.length ) );
}
pageList.setNavigateFirstPage( voPageList.getNavigateFirstPage() );
pageList.setNavigateLastPage( voPageList.getNavigateLastPage() );
return pageList;
}
}
测试类:
public static void main(String[] args) {
xxbmVO vo=new xxbmVO();
vo.setXxbm("学校编码");
vo.setXxmc("学校名称");
SchoolVO conver = SchoolMapper.INSTANCT.cover(vo);
String schoolCode = conver.getCode();
String schoolName = conver.getName();
System.out.println(schoolCode);
System.out.println(schoolName);
}
打印结果 :
学校编码
学校名称