最基础的mypstruct的用法,此处不再赘述,这里讲两种mypstruct的另外一些用法。
嵌套映射
所谓嵌套映射,就是说你传入的对象是A,要转换成B,但是嘞,A或者B里的某个要映射的字段,是属于A或者B的对象字段C中,如A.name -> B.student.name,这种情况属于嵌套映射,需要在@Mapping()的source或者target中加入该字段的名字即可。
如图所示[1]:
指定自定义实现
遇到更复杂的情况,可能用嵌套或者expression不够用了的话,就需要自定义一个实现类。
我这里和[1]中的略有不同的是,我这里Mapper接口上的注解和他略有不同,经测试是可以使用的,代码示例如下:
@Mapper(componentModel = "spring")
public interface Converter {
Person convert(StudentDO studentDO);
}
自定义实现
@Component
public class ConverterDecorator implements Converter{
@Autowired
private Converter converter;
Person convert(StudentDO studentDO){
return converter.convert(student);
}
}
注意,我的这个方式,需要把注入spring的bean改为ConverterDecorator ,而不是原来的接口Converter
。在使用转换器时,注入和使用ConverterDecorator 而不是Converter 。
文章[1]中的方式,需要将ConverterDecorator 中的构造器声明为公有,否则编译会报错。
经测试示例如下:
@Component
@Mapper(componentModel = "spring")
@DecoratedWith(ContentConverterDecorator.class)
public interface Converter {
Person convert(StudentDO studentDO);
}
自定义实现
public class ConverterDecorator implements Converter{
@Autowired
private Converter converter;
public ConverterDecorator() {
}
public ConverterDecorator(Converter converter) {
this.converter = converter;
}
Person convert(StudentDO studentDO){
return converter.convert(student);
}
}
参考文献:
[1],MapStruct最详细的使用教程,别在用BeanUtils.copyProperties ()
[2],mapstruct 详解及使用教程