两个实体类字段不同实现赋值 (MapStruct)

场景:我调用的下游服务返回的参数命名是拼音首字母,而我返回给第三方的需要是英文命名。故需两个实体类字段完全不一样赋值 (不想用get 在 set)

MapStruct特点

  1. 基于注解
  2. 在编译期自动生成映射转换代码
  3. 类型安全、高性能、无依赖性

实现:

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);
   
    }

打印结果 :

学校编码
学校名称
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值