小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
上文我们用简单的案例带大家熟悉了 mapstruct 的使用情况,接下来我们继续深入,了解一下自定义转换类的使用情况!
@Mapper
我们翻开上边提到的 Mapper 注释的源码,该注释的解释是:将接口或抽象类标记为映射器,并通过 MapStruct 激活该类型实现的生成。我们找到其中的 componentModel 属性,默认值为 default,它有四种值供我们选择:
- default:映射器不使用组件模型,实例通常通过
Mappers.getMapper(java.lang.Class)获取; - cdi:生成的映射器是
application-scoped的CDI 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;
}
}
- 在
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可以加入技术交流群参与讨论呦!