MapperStruct 对象转化

功能介绍

方便dto之间的转换,提供了两种方式,对于不同属性名和相同属性名均提供了方法

项目使用

针对controller层和service层的对象转换上可方便使用,以下是使用步骤:

  1. pom文件
    增加依赖

    <dependency>
        <groupId>org.mapstruct</groupId>
         <artifactId>mapstruct-jdk8</artifactId>
         <version>1.2.0.CR1</version>
     </dependency>
     <dependency>
         <groupId>org.mapstruct</groupId>
         <artifactId>mapstruct-processor</artifactId>
         <version>1.2.0.CR1</version>
         <scope>provided</scope>
     </dependency>
    
  2. 注解componentModel参数值:

    default: 这是默认的情况,mapstruct不使用任何组件类型, 可以通过Mappers.getMapper(Class)方式获取自动生成的实例对象。

    cdi: the generated mapper is an application-scoped CDI bean and can be retrieved via @Inject

    spring: 生成的实现类上面会自动添加一个@Component注解,可以通过Spring的 @Autowired方式进行注入

    jsr330: 生成的实现类上会添加@javax.inject.Named 和@Singleton注解,可以通过 @Inject注解获取。

  3. 常用用法
    对于相同属性名,创建一个接口,保证对应字段名相同即可

@Mapper(componentModel = "spring")
public interface TestConverter {

   /**
    * 根据 testVo对象创建 TestDto 对象
    * @param testVo
    * @return
    */
   TestDto from(TestVo testVo);
}

对于不同属性名,则需要对应字段映射

@Mapper(componentModel = "spring")
public interface UserConver {

   @Mappings({
           @Mapping(source = "id",target = "idUser"),
           @Mapping(source = "title",target = "title"),
           @Mapping(source = "pricez",target = "pricez")
   })
   UserVo item2Dto(User user);
}

4.现象
在编译完成后,在target包class文件中相同位置中会生成对应的impl文件

使用举例

CarVo定义:

import lombok.Data;

import java.io.Serializable;
import java.util.List;

@Data
public class CarDto implements Serializable {

    private String carNo;

    private int carId;

    private String carType;

    private List<String> catInfos;

    private long car4;

    private String car5;
} 

CarVo定义:

import lombok.Data;

import java.io.Serializable;
import java.util.List;

@Data
public class CarVo implements Serializable {

    private String carNo;

    private int carId;

    private String carType;

    private List<String> catInfos;

    private String car1;

    private int car2;

    private boolean car3;
}

使用接口定义

import com.dx.test.common.vo.CarDto;
import com.dx.test.common.vo.CarVo;
import org.mapstruct.Mapper;

@Mapper(componentModel = "spring")
public interface CarChange {

    CarDto from(CarVo carVo);
}

调用(我使用的JUnit单元测试)

@Autowired
    private CarChange carChange;

    @Test
    public void test17() {
        CarVo carVo = new CarVo();
        List<String> infos = new ArrayList<>();
        infos.add("wer");
        infos.add("wfg");
        carVo.setCarNo("123");
        carVo.setCarId(123);
        carVo.setCarType("wer");
        carVo.setCatInfos(infos);
        carVo.setCar1("sdf");
        carVo.setCar2(1);
        carVo.setCar3(true);

        System.out.println(carChange.from(carVo));

    }

结果展示:
结果展示
自动生成的impl类
实现类
例子到这里基本结束,对于第二种需要映射属性的,只需要在接口上加上对应映射即可:

import com.sf.dx.test.common.vo.CarDto;
import com.sf.dx.test.common.vo.CarVo;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;

@Mapper(componentModel = "spring")
public interface CarChange {

    @Mappings({
            @Mapping(source = "car1",target = "car5"),
            @Mapping(source = "car2",target = "car4")
    })
    CarDto from(CarVo carVo);
}

这里补充说明:这里的mapping可以仅映射字段名对不上的,字段名能对上的会自动映射。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值