当前位置: 首页 > 知识库问答 >
问题:

Mapstruct将一个字段映射到多个目标字段,反之亦然

何涵育
2023-03-14

我提到了用Mapstruct将多个源字段映射到同一类型目标字段的问题,但这没有帮助

我的rest资源类如下所示

class Base {
//fields
//getters and setters
}

Class A extends Base{
List<String> emailAdddress;
//other fields
//getters and setters
}

Class B extends Base{
List<String> devices;
//other fields
//getters and setters
}

Class C extends Base{
List<String> mobileNumbers;
//other fields
//getters and setters
}

我的实体类是源代码,如下所示:

 Class Source {
    String address
    //other fields
    //getters and setters
    }

我想在mapper类中用emailAdddress或devices或mobileNumbers映射源类中的地址,我尝试在mapper类中使用@AfterMapping和一个decorator类,但它没有帮助。

我有一个像这样的映射器类

@Mapper
public abstract class AddressMapper {
     //basic mappings here

public abstract Source toEntity(Base b);
public abstract Base toDomain(Source src);

   @AfterMapping 
   public void setAddressInfo(@MappingTarget Source src, B b) {
        src.setAddress(b.getDevices().toString());
}

共有1个答案

邢华清
2023-03-14

我不确定我是否完全明白你想做什么。

但是,如果要映射特定的类(ABC),则需要将这些类放在方法中。因为MapStruct是一个注释处理器,在编译期间,它只知道示例中的base字段。可以做的事情如下:

@Maper
public interface AdressMapper {


    default Source toEntity(Base b) {
        if (b == null) {
            return null;
        } else if (b instanceOf A) {
            toEntity((A) b);
        } else if (b instanceOf B) {
            toEntity((A) b);
        } else if (b instanceOf C) {
            toEntity((C) b);
        } else {
            // Decide what to do
        }
    }

    @Mapping(target = "address", source = "emailAddress")
    Source toEntity(A a);

    @Mapping(target = "address", source = "devices")
    Source toEntity(B b);

    @Mapping(target = "address", source = "mobileNumbers")
    Source toEntity(C c);

    default Base toDomain(Source source) {
        if (source == null) {
            return null;
        } else if (condition to match to A) {
            return toDomainA(source);
        } else if (condition to match to B) {
            return toDomainB(source);
        } else if (condition to match to C) {
            return toDomainC(source);
        }
    }

    @Mapping(target = "emailAddress", source = "address")
    A toDomainA(Source source);

    @Mapping(target = "devices", source = "address")
    B toDomainB(Source source);

    @Mapping(target = "mobileNumbers", source = "address")
    C toDomainB(Source source);


    // This method is needed so MapStruct knows how to map from List<String> into String
    static <T> String listToString(List<T> list) {
        if (list == null) {
            return null;
        }

        return list.toString();
    }

    // This method is needed so MapStruct know hot to map from String into List<String>
    static List<String> fromListToString(String string) {
        if (string == null) {
            return null;
        }

        // Perform your own conversion
    }
}
 类似资料:
  • “想要解决方案B” 有什么办法可以做到这一点吗?

  • 我把这三门课分别放在不同的文件中 我有下面的映射器 这目前仅映射lastName并起作用,我想将Book中的作者字符串映射为 我怎么能这么做?我在MapStruct文档中找不到任何东西。

  • 考虑以下POJO: 使用MapSTRt,我创建了一个映射器,将映射到。由于“业务”“逻辑”,我需要将和约束为的和字段值。这是我使用另一个类得出的结论: 有没有其他方法可以实现这一点(即另一种映射器、装饰器等)?如何将多个值(xml附表、讲座)传递给映射器?

  • 我需要将源类中的字段值映射到字段属性。我可以使用Mapstruct使用@mapper注释的'expression'参数来完成 有没有其他方法可以不使用“表达式”来进行映射?

  • “”“@Data@Builder(toBuilder=true)@allargsconstuctor@noargsconstuctor public class ServiceAddress{private String addLine1;private String addLine2;private String city;private String state;private String

  • 我使用Mapstruct来处理将一个POJO映射到另一个POJO的样板代码。 以下是DTO: 这是映射的POJO: 我正在寻找一种优雅的方法来处理和之间的映射。目前,我正在使用注释的属性。由于引用了我使用的是“周期映射”示例中的。 该界面还包含一个方法映射到,名称为。 有没有更优雅的方法来实现将不可编辑的转换为?我的方法可行,但也有缺点。例如,重构不能识别字符串中的代码片段。