还在用BeanUtils拷贝对象?MapStruct才是王者

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

上文中我们了解了 @Mapper 的使用情况并用小案例来演示了自定义转换类的使用,本文我们将对 @Mapping 注解以及 expression 属性进行演示。

@Mapping

@Mapping 可以用来配置一个 bean 属性或枚举常量的映射,默认是将具有相同名称的属性进行映射,当然也可以用 sourceexpression 或者 constant 属性手动指定,接下来我们来分析下常用的属性值。

  1. target:属性的目标名称,同一目标属性不能映射多次。如果用于映射枚举常量,则将给出常量成员的名称,在这种情况下,源枚举中的多个值可以映射到目标枚举的相同值。
  2. source:属性的源名称,
  • 如果带注释的方法有多个源参数,则属性名称必须使用参数名称限定,例如“addressParam.city"
  • 当找不到匹配的属性时,MapStruct 将查找匹配的参数名称;
  • 当用于映射枚举常量时,将给出常量成员的名称;
  • 该属性不能与 constantexpression 一起使用;
  1. dateFormat:通过 SimpleDateFormat 实现 StringDate 日期之间相互转换。
  2. numberFormat:通过 DecimalFormat 实现 NumberString 的数值格式化。
  3. constant:设置指定目标属性的常量字符串,当指定的目标属性的类型为:primitiveboxed(例如 Long)时,MapStruct 检查是否可以将该 primitive 作为有效的文本分配给 primitiveboxed 类型。如果可能,MapStruct 将分配为文字;如果不可能,MapStruct 将尝试应用用户定义的映射方法。

另外,MapStruct 将常量作为字符串处理,将通过应用匹配方法、类型转换方法或内置转换来转换该值。此属性不能与 sourcedefaultValuedefaultExpressionexpression 一起使用。
6. expression:是一个表达式,根据该表达式设置指定的目标属性。他的属性不能与 sourcedefaultValuedefaultExpressionconstant 一起使用。
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可以加入技术交流群参与讨论呦!