还在用BeanUtils拷贝对象?MapStruct才是王者!【附源码】(三)

471 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

上文我们用简单的案例带大家熟悉了 mapstruct 的使用情况,接下来我们继续深入,了解一下自定义转换类的使用情况!

@Mapper

我们翻开上边提到的 Mapper 注释的源码,该注释的解释是:将接口或抽象类标记为映射器,并通过 MapStruct 激活该类型实现的生成。我们找到其中的 componentModel 属性,默认值为 default,它有四种值供我们选择:

  • default:映射器不使用组件模型,实例通常通过 Mappers.getMapper(java.lang.Class)获取;
  • cdi:生成的映射器是 application-scopedCDI bean,可以通过 @Inject 获取;
  • spring:生成的映射器是 Spring bean,可以通过 @Autowired 获取;
  • jsr330:生成的映射器被 @javax.inject.Named@Singleton 注释,可以通过 @inject 获取;

上边我们用的就是默认的方法,当然我们也可以用 @Autowired 来引入接口依赖,此处不再举例,有兴趣的小伙伴可以自己试试!

另外我们可以看下 uses 属性:可以通过定义其他类来完成字段转换,接下来我们来个小例子演示一下:

1. 定义一个 CarVo.java 类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class CarVo {

    private String make;
    private int seatCount;
    private boolean type;
}

2. 在 mapper 中定义一个 vo 转为 dto 的方法 CarDto carVoToCarDto(CarVo carVo);

当不加 uses 属性时,查看编译后生成的实现类

public CarDto carVoToCarDto(CarVo carVo) {
	if (carVo == null) {
		return null;
	} else {
		CarDto carDto = new CarDto();
		carDto.setMake(carVo.getMake());
		carDto.setSeatCount(carVo.getSeatCount());
		carDto.setType(String.valueOf(carVo.isType()));
		return carDto;
	}
}
  1. mapper 上增加 uses 属性,并指定自定义的处理类,代码如下:
@Mapper(uses = {BooleanStrFormat.class})
public interface CarMapper {
    ......
}

/**
* 自定义的转换类
*/
@Component
public class BooleanStrFormat {
    public String toStr(boolean type) {
        if(type){
            return "Y";
        }else{
            return "N";
        }
    }

    public boolean toBoolean(String type) {
        if (type.equals("Y")) {
            return true;
        } else {
            return false;
        }
    }
}

/**
* 查看编译后生成的实现类
*/
public CarDto carVoToCarDto(CarVo carVo) {
	if (carVo == null) {
		return null;
	} else {
		CarDto carDto = new CarDto();
		carDto.setMake(carVo.getMake());
		carDto.setSeatCount(carVo.getSeatCount());
        //调用自定义的类中的方法
		carDto.setType(this.booleanStrFormat.toStr(carVo.isType()));
		return carDto;
	}
}

4.客户端代码

@Test
public void shouldMapCarVoToDto() {

	CarVo carVo = new CarVo( "Morris", 5, false );
	CarDto carDto = CarMapper.INSTANCE.carVoToCarDto( carVo );

	System.out.println(carDto);
}

执行结果:

自定义转换类的使用你掌握了吗?在接下来的文章中我们还会继续用案例来帮助大家更好的理解 mapstruct 的使用!如果你有不同的意见或者更好的idea,欢迎联系阿Q,添加阿Q可以加入技术交流群参与讨论呦!