MapStruct,是一个参数转换器,类似apache的BeanUtil.copyProperties,但是MapStruct的性能要比copyProperties的性能好。copyProperties只能作用在同类型的属性上并且属性还要一样,还会容易出现异常,有些规范会严禁使用这个方法进行参数转换。
MapStruct的原理类似lombok,MapStruct都是在编译期进行实现的,而且是基于get、set,没有使用反射所以一般不存在运行时性能问题。
引入依赖
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.3.1.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.1.Final</version>
</dependency>
例1.
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
@Mapper(componentModel = "spring")//MapStruct 转换 Mapper 注入Spring IoC 容器
public interface SearchItemOutputConverter {
/**
* 商品单普通属性rest入参转dubbo入参
*
* @param itemGeneralPropInfo
* @return
*/
@Mappings({
@Mapping(source = "propId", target = "explainCode"),
@Mapping(source = "propName", target = "explainName"),
@Mapping(source = "propValue", target = "explainNote"),
@Mapping(source = "user.userName", target = "userName"),
@Mapping(source = "money", target = "goods.price"),
@Mapping(target = "password", ignore = true),//忽略此属性
@Mapping(target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss")//格式化
})
ItemGenericAttribute rpc2rest(ItemGeneralPropInfo itemGeneralPropInfo);
}
备注:user是itemGeneralPropInfo里面的一个user对象;goods是ItemGenericAttribute里面的对象;如果ItemGeneralPropInfo和ItemGenericAttribute里面的属性名一样的话,就会默认直接转换,不需要指定了。对于包装类型,是自动拆箱封箱操作的,并且是线程安全的。
MapStruct编译之后会在maven下面的子目录( maven是 target\generated-sources\annotations)生成一个实现类(SearchItemOutputConverterImpl)
例2:
@Mapping(target = "stringProperty", source = "stringProp", defaultValue = "undefined")
备注:设置默认值,当目标为null时我们可以设置默认值,这些都是基本类型或者是包装类型
例3:
@Mapping(target = "stringConstant", constant = "Constant Value")
备注:设置常量的时候是不能指定source的,直接指定常量值
例4:
@Mapping(source = "price", numberFormat = "$#.00")
备注:数字格式化,遵循java.text.DecimalFormat的规范
例5:
@IterableMapping(dateFormat = "dd.MM.yyyy")
List<String> stringListToDateList(List<Date> dates);
备注:将一个日期集合映射到日期字符串集合的格式化
例6:
default List<UserConfig> strConfigToListUserConfig(String config) {
return JSON.parseArray(config, UserConfig.class);
}
备注:自定义类型转换,直接在转换器里面添加自定义转换方法,示例中的config是某个对象里面的一个json字符串属性,需要转为对象。定义好方法之后,MapStruct当匹配到合适类型的字段时,会调用自定义的转换方法进行转换
自定义的默认方法只支持jdk1.8及以上
例7:
@Mappings({ @Mapping(target = "createTime", expression = "java(com.java.mmzsblog.util.DateTransform.strToDate(source.getCreateTime()))"), })
UserVO3 toConvertVO3(User source);
备注:会使用com.java.mmzsblog.util.DateTransform.strToDate 这个方法对数据进行处理然后赋值。
如果项目里面也使用了Lombok时,Lombok的版本要高于或者等于1.18.10,否则会有编译不通过的情况