Skip to content
Advertisement

Mapping multiple fields to one in Mapstruct?

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.

Advertisement

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.

User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement