描诉:符合应用场景的实用的mapStruct对于bean映射的方法
1.使用自定义转换器(Converters): 如果你需要自定义映射逻辑,可以创建自定义转换器类,并使用@Mapper
注解的uses
属性来引用它们。这允许你在映射中使用自定义方法,以满足特定需求.
@Mapper(uses = {CustomConverter.class}) public interface MyMapper { MyDto entityToDto(MyEntity entity); }
2.使用expression
属性: 在@Mapping
注解中,你可以使用expression
属性来定义更复杂的映射表达式,包括Java表达式和方法引用。这对于执行特定的映射逻辑非常有用。
@Mapping(target = "fullName", expression = "java(entity.getFirstName() + ' ' + entity.getLastName())") MyDto entityToDto(MyEntity entity);
3. 映射继承: 如果你有多个映射接口,并且它们具有相似的映射规则,你可以使用@InheritInverseConfiguration
和@InheritConfiguration
来继承映射配置。这减少了代码重复并提高了可维护性。
3.1 @InheritConfiguration: 这个注解用于继承源映射方法的配置,以便将其应用于目标映射方法。这是在目标映射方法上使用的注解。
- 在源映射方法上定义配置(通常是在源映射接口中)。
- 使用
@InheritConfiguration
注解在目标映射方法上引用源映射方法的配置。
@Mapper public interface CarMapper { @InheritConfiguration CarDto carToCarDto(Car car); // Other mapping methods } @Mapper public interface PersonMapper { @InheritConfiguration PersonDto personToPersonDto(Person person); // Other mapping methods }
3.2 @InheritInverseConfiguration: 这个注解用于继承目标映射方法的逆向映射配置。逆向映射是指从目标类型到源类型的映射,通常用于更新操作。这是在目标映射方法的逆向映射方法上使用的注解。
- 在目标映射方法的逆向映射方法上定义配置。
- 使用
@InheritInverseConfiguration
注解在源映射方法上引用逆向映射方法的配置。
@Mapper public interface CarMapper { @InheritInverseConfiguration Car updateCarFromDto(CarDto carDto, @MappingTarget Car car); // Other mapping methods } @Mapper public interface PersonMapper { @InheritInverseConfiguration Person updatePersonFromDto(PersonDto personDto, @MappingTarget Person person); // Other mapping methods }
4. 条件映射: 使用condition
属性在@Mapping
注解中定义条件,以便仅在满足条件时进行映射。
//编写条件表达式: 在条件属性中,你可以编写一个Java表达式,该表达式应该返回一个布尔值(true或false)。这个表达式通常包括在java()方法中,以便在MapStruct中进行评估。 @Mapping(source = "sourceField", target = "targetField", condition = "java(source.getCondition() == 1)") TargetDto sourceToTarget(SourceEntity source); //在上面的示例中,条件表达式检查sourceField的某个属性是否等于1。如果等于1,则条件为//真,映射将执行;否则,映射将被跳过。 //在条件表达式中使用源对象的属性: 你可以在条件表达式中使用源对象的属性,以便根据源//对象的状态或值来决定是否执行映射。 @Mapping(source = "sourceField", target = "targetField", condition = "java(source.getSomeFlag() == true)") TargetDto sourceToTarget(SourceEntity source);
5. 映射构造函数: MapStruct支持通过构造函数进行映射,可以通过@Mapper
注解的componentModel
属性设置为"spring"
或"cdi"
来启用构造函数映射。这对于将数据直接注入到DTO或实体中非常有用。
6. 后处理映射: 使用@AfterMapping
注解来标记一个方法,该方法会在映射完成后执行,允许你执行额外的处理步骤。