MapStruct(实体对象转换)

1.1背景:

        每层(应用层,服务层,持久层)有自己的数据传输对象,当数据流程到该层由需要将数据转成符合要求的格式,比如:当数据由应用层流转到 服务层则需要将数据转成DTO格式,当数据由服务层流向持久层则需要将数据转成Entity格式数据。

下边的代码数据由服务层流向持久层:

@Override
public MerchantDTO createMerchant(MerchantDTO merchantDTO) {
    Merchant merchant = new Merchant();
    //设置审核状态0‐未申请,1‐已申请待审核,2‐审核通过,3‐审核拒绝
    merchant.setAuditStatus("0");
    //设置手机号
    merchant.setMobile(merchantDTO.getMobile());
    //...
    //保存商户
    merchantMapper.insert(merchant);
    //将新增商户id返回
    merchantDTO.setId(merchant.getId());
    return merchantDTO;
}

上边代码的问题是:由merchantDTO转成entity实现过程繁琐。

1.2 MapStruct解决数据传输对象转换的繁琐

        MapStruct是一个代码生成器,它基于约定优于配置的方法大大简化了Java Bean对象之间的映射转换的实现。MapStruct 使用简单的方法即可完成对象之间的转换,它速度快、类型安全且易于理解。

官方地址:MapStruct – Java bean mappings, the easy way!

1.3 添加MapStruct依赖。
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-jdk8</artifactId>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>${org.mapstruct.version}</version>
</dependency>

2.1 服务层对象转换

在商户服务工程huiminpay-merchant-service定义商户对象转换类

定义MerchantConvert转换类,使用@Mapper注解快速实现对象转换

package com.huiminpay.merchant.convert;

import com.huiminpay.merchant.entity.Merchant;
import com.yh.merchant.api.dto.MerchantDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

@Mapper
public interface MerchantConvert {
    /**
     * 为客户端提供对映射器的实现访问,官方文档定义
     */
    MerchantConvert INSTANCE = Mappers.getMapper(MerchantConvert.class);

    /**
     * 将entity转换成DTO
     */
    MerchantDTO entity2dto(Merchant merchant);

    /**
     * 将DTO转换成entity
     */
    Merchant dto2entity(MerchantDTO merchantDTO);
}

在MerchantConvert中定义测试方法:

    public static void main(String[] args) {
        MerchantDTO merchantDTO = new MerchantDTO();
        merchantDTO.setUsername("测试");
        merchantDTO.setPassword("111");
        Merchant entity = MerchantConvert.INSTANCE.dto2entity(merchantDTO);
        System.out.println(entity);
        //entity转dto
        entity.setMobile("123444554");
        MerchantDTO merchantDTO1 = MerchantConvert.INSTANCE.entity2dto(entity);
        System.out.println(merchantDTO1);
    }

2.2 List数据也可以转换:

 /**
  * List集合之间的转换
  */
 List<MerchantDTO> listEntity2DTO(List<Merchant> list);

2.3 注意MapStruct版本问题

因工程内使用Swagger依赖MapStruct(其版本低与lombok同时使用会出现找不到实现类异常),解决办法如下,可在common工程内引用版本,并去除swagger中的MapStruct

解决办法

因为版本问题,需要先把swagger内置的依赖文件排除,然后重新添加依赖

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-jdk8</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
        </exclusion>	
    </exclusions>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-jdk8</artifactId>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>${org.mapstruct.version}</version>
</dependency>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值