相关文章推荐
不要命的饼干  ·  Jackson对象 ...·  1 周前    · 
聪明伶俐的水龙头  ·  python 等待函数 ...·  1 年前    · 
精明的书包  ·  tsconfig paths 无效? | ...·  1 年前    · 

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

    //创建后处理方法: 在同一映射接口中,编写一个方法并用@AfterMapping注解标记它。这个//方法将在映射完成后执行。
    @Mapper
    public interface MyMapper {
        TargetDto sourceToTarget(SourceEntity source);
        @AfterMapping
        default void afterMapping(SourceEntity source, @MappingTarget TargetDto target) {
            // Add custom post-mapping logic here
            target.setAge(target.getAge() * 2); // Double the age, for example