将多个字段映射到Mapstruct中的一个字段?

时间:2020-08-31 21:05:15

标签: java mapping mapstruct

我需要从公开银行课程映射到我的核心课程。我正在与mapstruct合作。我需要将多个枚举字段映射到核心类中的一个。但是我认为mapstruct不支持映射多个字段。有什么棘手的方法或解决方案吗? 提前致谢! 这是我从开放银行获得的枚举值:

public enum Category {

  TRANS_AND_SAVINGS_ACCOUNTS("TRANS_AND_SAVINGS_ACCOUNTS"),  
  REGULATED_TRUST_ACCOUNTS("REGULATED_TRUST_ACCOUNTS"),  
  CRED_AND_CHRG_CARDS("CRED_AND_CHRG_CARDS"),  
  PERS_LOANS("PERS_LOANS"),  
  MARGIN_LOANS("MARGIN_LOANS"),  
  PROPERTY_LOANS("PROPERTY_LOANS"),  
  TRADE_FINANCE("TRADE_FINANCE"),  
  OVERDRAFTS("OVERDRAFTS"),  
  BUSINESS_LOANS("BUSINESS_LOANS"),
  RESIDENTIAL_MORTGAGES("RESIDENTIAL_MORTGAGES");

...

}

这是我的核心课程:

    public enum Type{

        CHARGES( "Charges" ),
        CREDITS( "Credits" ),
        ALL_LOANS( "AllLoans" ),
        MORTGAGE( "Mortgage" ),
        OTHER( "Other" ),
        PREPAIDCARD( "PrePaidCard" ),
        SAVINGS( "Savings" );

...

}

我有一个valueMapping,如下所示(这是错误的):

public interface TypeMapper {
    @ValueMappings( {
            @ValueMapping(source = "CHARGES", target= "CRED_AND_CHRG_CARDS"),
            @ValueMapping(source = "CREDITS", target= "CRED_AND_CHRG_CARDS"),
            @ValueMapping(source = "ALL_LOANS", target = "PERS_LOANS"),
            @ValueMapping(source = "ALL_LOANS", target = "MARGIN_LOANS"),
            @ValueMapping(source = "ALL_LOANS", target = "BUSINESS_LOANS"),
            @ValueMapping(source = "ALL_LOANS", target = "PROPERTY_LOANS"),
            @ValueMapping(source = "MORTGAGE", target= "RESIDENTIAL_MORTGAGES"),
            @ValueMapping(source = "OTHER", target= "OVERDRAFTS"),
            @ValueMapping(source = "PREPAIDCARD", target = MappingConstants.NULL),
            @ValueMapping(source = "SAVINGS", target = "TRANS_AND_SAVINGS_ACCOUNTS")
    } )

...

}

它不接受将PERS_LOANS("PERS_LOANS"), MARGIN_LOANS("MARGIN_LOANS"), PROPERTY_LOANS("PROPERTY_LOANS")映射到ALL_LOANS。我想知道是否有一种方法可以将所有3个映射到一个字段。也许可以在@AfterMapping中涵盖它,有什么建议吗?而且我想将所有未映射的值映射到核心类中的OTHER

2 个答案:

答案 0 :(得分:0)

您必须自己实现它,因为MapStruct不支持它。尝试将@qualifiedByName注释与您自己的方法一起使用

例如:

public interface TypeMapper{
    @Mapping(target= "CRED_AND_CHRG_CARDS", qualifiedByName = "creditAndChrgCardsMapping")
    public Type CategoryToType(Category category);
    
    default String qualifiedByName (String charges, String credits){
    //Implement your business logic for example
    return charges + credits;
    } 
 }

答案 1 :(得分:0)

在您的问题中,您说不能将PERS_LOANSMARGIN_LOANS等映射到ALL_LOANS。但是,您的值映射是相反的。您正在将ALL_LOANS映射到PERS_LOANS

不可能将一个枚举(源)值映射到多个枚举(目标)值。但是,可以将多个枚举(源)值映射到相同的枚举(目标)值。