Mapstruct

  • Post author:
  • Post category:其他




前言

MapStruct是一个Java注释处理器,用于生成类型安全的bean映射类。

您要做的就是定义一个映射器接口,该接口声明任何必需的映射方法。在编译期间,MapStruct将生成此接口的实现。此实现使用简单的Java方法调用在源对象和目标对象之间进行映射,即没有反射或类似内容。

与手动编写映射代码相比,MapStruct通过生成繁琐且易于出错的代码来节省时间。遵循配置方法上的约定,MapStruct使用合理的默认值,但在配置或实现特殊行为时不加理会。

与动态映射框架相比,MapStruct具有以下优点:

1、通过使用普通方法调用(settter/getter)而不是反射来快速执行

2、编译时类型安全性:只能映射相互映射的对象和属性,不能将order实体意外映射到customer DTO等。

3、如果有如下问题,编译时会抛出异常

3.1 映射不完整(并非所有目标属性都被映射)

3.2 映射不正确(找不到正确的映射方法或类型转换)

4、可以通过freemarker定制化开发



1. 设置

MapStruct是基于JSR 269的Java注释处理器,因此可以在命令行构建(javac,Ant,Maven等)以及您的IDE中使用。

它包含以下工件:

org.mapstruct:mapstruct:包含必需的注释,例如@Mapping

org.mapstruct:mapstruct-processor:包含注释处理器,该注释处理器生成映射器实现



2. 基本映射

要创建映射器,只需使用所需的映射方法定义一个Java接口,并用注释对其进行org.mapstruct.Mapper注释:

该@Mapper注释将使得MapStruct代码生成器创建的执行PersonMapper 过程中生成时的界面。

在生成的方法实现中,源类型(例如Person)的所有可读属性都将被复制到目标类型(例如PersonDTO)的相应属性中:

当一个属性与其目标实体对应的名称相同时,它将被隐式映射。

当属性在目标实体中具有不同的名称时,可以通过@Mapping注释指定其名称。

如果不指定@Mapping,默认映射name相同的field

如果映射的对象field name不一样,通过 @Mapping 指定。

忽略字段加@Mapping#ignore() = true



2.1 指定默认值

在@Mapper接口类里面的转换方法上添加@Mapping注解

target() 必须添加,source()可以不添加,则直接使用defaultValue



3. 逆映射

在双向映射的情况下,例如从实体到DTO以及从DTO到实体,前向方法和反向方法的映射规则通常是相似的,并且可以通过切换source和来简单地反转target。

使用注释@InheritInverseConfiguration表示方法应继承相应反向方法的反向配置



4. 继承配置

方法级配置注解,例如@Mapping,@BeanMapping,@IterableMapping,等等,都可以继承从一个映射方法的类似使用注释方法@InheritConfiguration:

上面的示例声明了一种carDtoToCar()具有配置的映射方法,该配置定义了应如何映射numberOfSeats类型中的属性Car。在现有Instance实例上执行映射的update方法Car需要相同的配置才能成功映射所有属性。通过声明@InheritConfiguration该方法,MapStruct可以搜索继承候选,以应用继承自该方法的注释。

如果所有类型的A(源类型和结果类型)都可以分配给B的相应类型,则一个方法A可以从另一种方法B继承配置。

如果可以使用多个方法作为继承的源,则必须在注释中指定方法名称:@InheritConfiguration( name = “carDtoToCar” )。

一种方法,可以使用==@InheritConfiguration==和覆盖或通过另外施加修改的配置@Mapping,@BeanMapping等等。



4.1 共享配置

MapStruct提供了通过指向带注释的中央接口来定义共享配置的可能性@MapperConfig。为了使映射器使用共享配置,需要在@Mapper#config属性中定义配置接口。

该@MapperConfig注释具有相同的属性@Mapper注释。任何未通过via指定的属性@Mapper都将从共享配置中继承。中指定@Mapper的属性优先于通过引用的配置类指定的属性。列表属性例如uses可以简单组合

共享配置config,配置一些检查策略

例如:

unmappedSourcePolicy()、unmappedTargetPolicy() : 源或者目标没有标注映射的属性怎么报告

typeConversionPolicy() :应该报告如何进行有损(缩小)转换,例如:long到integer的转换。

collectionMappingStrategy(): 集合类型映射策略

其他的,请阅读源码



注:



MapStruct属于在编译期,生成调用get/set方法进行赋值的代码,生成对应的Java文件。在编译期间消耗少许的时间,换取运行时的高性能

MapStruct的性能基本上优于BeanUtils一个数量级。



版权声明:本文为weixin_42491646原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。