关于mapStruct-高阶用法

发布时间 2023-10-30 11:07:27作者: _Origin

描诉:符合应用场景的实用的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注解来标记一个方法,该方法会在映射完成后执行,允许你执行额外的处理步骤。