Mapping multiple fields to one in Mapstruct?

Tags: , ,



I need to map from an open banking class to my core class. I am working with mapstruct. I need to map multiple enum fields to one on my core class. But i think mapstruct doesn’t support mapping multiple fields. Any tricky way or a solution for that? Thanks in advance! Here is my enum values from open banking:

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");

...

}

And here is my core class:

    public enum Type{

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

...

}

And i have a valueMapping as following(which is wrong):

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")
    } )

...

}

It does not accept to map PERS_LOANS("PERS_LOANS"), MARGIN_LOANS("MARGIN_LOANS"), PROPERTY_LOANS("PROPERTY_LOANS") to ALL_LOANS. I wonder if there’s a way to map all 3 to one field. Maybe can it be covered in @AfterMapping, any suggestions? And i want to map all the unmapped values to OTHER in my core class.

Answer

In your question you are saying that you can’t map PERS_LOANS, MARGIN_LOANS, etc. to ALL_LOANS. However, your value mappings are reversed. You are mapping ALL_LOANS to PERS_LOANS.

It is not possible to map one enum (source) value to multiple enum (target) values. However, it is possible to map multiple enum (source) values to the same enum (target) value.



Source: stackoverflow