简介
mapstrct是一个很好注释处理的框架,解决繁琐domain之间值的转换,节约开发的时间,同时相对应copyProperty的好处是没有使用反射技术,使性能更优。mapstrut一共两个主要的包,org.mapstruct.mapstruct包含里面常用的注释,org.mapstruct.mapstruct-processor处理注释的实现。
官方文档
API & 使用
MAVEN
1 | <!-- 指定版本 --> |
基本使用
- 定义一个接口,并使用
@Mapper
- 定义一个转换的方法。方法上常用的注解
1 | "",source="")、 (target= |
ps:如果target和source字段相同的则无需使用注解,mapstruct会自动为我们copy值的
方法名称上面如果有个可以忽略自动引入的注解,可以防止target copy source的时候报错@BeanMapping(ignoreByDefault=true)
eg:基本使用
1 | /** |
mapstruct 自动实现接口代码如下
1 | ( |
因为使用了@BeanMapping(ignoreByDefault = true)
,所以可以看到只有我们指定的那些字段才进行了赋值,如果,我们去掉@BeanMapping,他的实现类是这样的
1 |
|
- 类型的转换有三种特殊的
- 常见基本类型的不同,
@Mapping
会自动转换 - bean不同的类型的转换 会创建或者调用其他的方法
- collection类型,如果相同的类型他会重新创建一个新的实例集合,并且赋值,如果不同的则会分开进行赋值。
1 |
|
- mapstruct可以自定义类型转换,只要入参的类型和返回值类型需要的一致,就会自动调用。同时mapstruct的定义不仅仅可以使用接口,也可以使用抽象类。
1 |
|
- mapstruct支持多个参数的,如果名字一样则会自动映射,不同则需要使用
@Mapping
,如果多个参数的都有target
的属性名需要制定是哪个source的属性名,否则会报错
1 | /** |
mapstruct可以直接将一个基本类型的字段直接映射对应的bean字段
1 | /** |
- mapstruct不仅仅可以create instance, 也可以更新instance,使用
@MappingTarget
1 | /** |
- 如果两个方向入参和返回值是相反,但是类型却是一样的,则可以使用反向映射
@InheritInverseConfiguration
,如果有多个复合条件的则可以指定固定的一个方法
1 | /** |
- mapstruct的依赖注入方式实现
1 |
|
Data type conversions
- 可以自动类型转换的
常见的类型及其他们的包装类mapstruct都是进行自动类型转换的。同时有些类型是可以转成string类型的。
mapstruct也是支持自定义类型的转换的@Mapper(uses = 自定义转换类.class)
当然也支持格式化,但是格式化的的参数同java.text.DecimalFormat
1 | /** |
ps:那些需要可能失去精度的转换可以控制他们的方案,是否需要抛异常默认是 ReportingPolicy typeConversionPolicy() default ReportingPolicy.IGNORE
;
- 自定义类型转换
- 一种是上面说到的
@Mapper(uses = BooleanStrategy.class)
- 另外一种是需要自定义多个相同的映射法则的时候,可以使用
@Qualifier
注解
- 默认值的问题
defaultValue 必须是target和source必须都有的情况下才可以赋值默认值,只有target没有source的时候,可以使用constant
1 | (uses = StringListMapper.class) |
官网说明
If s.getStringProp() == null, then the target property stringProperty will be set to “undefined” instead of applying the value from s.getStringProp(). If s.getLongProperty() == null, then the target property longProperty will be set to -1. The String “Constant Value” is set as is to the target property stringConstant. The value “3001” is type-converted to the Long (wrapper) class of target property longWrapperConstant. Date properties also require a date format. The constant “jack-jill-tom” demonstrates how the hand-written class StringListMapper is invoked to map the dash-separated list into a List
.
Mapping Collection
- 原理是遍历source collection然后转换类型,put到target collection中
如果是可以自动转换的则自动转换,同date type conversion;若是无法自动转换的,则会查看是否有可以调用的类型
1 | (imports = Date.class) |
没有可以调用的方法,则mapstruct尝试自己实现
1 |
|
- map
1 | public interface SourceTargetMapper { |
- stream类型转换
1 | (imports = Date.class) |
Expressions
- 格式
expression = "java( 表达式 )"
1 | @Mapper |
- 其中使用的类名必须要指定到全路径,若是使用比较麻烦,也可以使用
imports
1 | (imports = {JSON.class, String.class, OptimusConfig.class}) |
- Default Expressions
1 | imports java.util.UUID; |