小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
上文中我们了解了 @Mapper 的使用情况并用小案例来演示了自定义转换类的使用,本文我们将对 @Mapping 注解以及 expression 属性进行演示。
@Mapping
@Mapping
可以用来配置一个 bean
属性或枚举常量的映射,默认是将具有相同名称的属性进行映射,当然也可以用 source
、expression
或者 constant
属性手动指定,接下来我们来分析下常用的属性值。
- target:属性的目标名称,同一目标属性不能映射多次。如果用于映射枚举常量,则将给出常量成员的名称,在这种情况下,源枚举中的多个值可以映射到目标枚举的相同值。
- source:属性的源名称,
- 如果带注释的方法有多个源参数,则属性名称必须使用参数名称限定,例如
“addressParam.city"
; - 当找不到匹配的属性时,
MapStruct
将查找匹配的参数名称; - 当用于映射枚举常量时,将给出常量成员的名称;
- 该属性不能与
constant
或expression
一起使用;
- dateFormat:通过
SimpleDateFormat
实现String
到Date
日期之间相互转换。 - numberFormat:通过
DecimalFormat
实现Number
与String
的数值格式化。 - constant:设置指定目标属性的常量字符串,当指定的目标属性的类型为:
primitive
或boxed
(例如Long
)时,MapStruct
检查是否可以将该primitive
作为有效的文本分配给primitive
或boxed
类型。如果可能,MapStruct
将分配为文字;如果不可能,MapStruct
将尝试应用用户定义的映射方法。
另外,MapStruct
将常量作为字符串处理,将通过应用匹配方法、类型转换方法或内置转换来转换该值。此属性不能与 source
、defaultValue
、defaultExpression
或 expression
一起使用。
6. expression:是一个表达式,根据该表达式设置指定的目标属性。他的属性不能与 source
、 defaultValue
、defaultExpression
、constant
一起使用。
7. ignore: 忽略这个字段。
我们用 expression
这个属性来实现一下上边用 uses
实现的案例:
1. 在 mapper 中定义方法
@Mapping(target = "type", expression = "java(new com.ittest.controller.BooleanStrFormat().toStr(carVo.isType()))")
CarDto carVoToDtoWithExpression(CarVo carVo);
复制代码
2. 生成的实现类
@Override
public CarDto carVoToDtoWithExpression(CarVo carVo) {
if ( carVo == null ) {
return null;
}
CarDto carDto = new CarDto();
carDto.setMake( carVo.getMake() );
carDto.setSeatCount( carVo.getSeatCount() );
carDto.setType( new com.ittest.controller.BooleanStrFormat().toStr(carVo.isType()) );
return carDto;
}
复制代码
3. 客户端
@Test
public void mapCarVoToDtoWithExpression() {
CarVo carVo = new CarVo( "Morris", 5, false );
CarDto carDto = CarMapper.INSTANCE.carVoToDtoWithExpression( carVo );
System.out.println(carDto);
}
复制代码
运行结果:
重要提示:枚举映射功能已被弃用,并被
ValueMapping
取代。它将在后续版本中删除。
至于其他的用法大家可以多多探索。如果你有不同的意见或者更好的idea
,欢迎联系阿Q,添加阿Q可以加入技术交流群参与讨论呦!
近期评论