Сопоставление нескольких полей с одним в 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 в моем основном классе.


person miador    schedule 31.08.2020    source источник
comment
может ты перепутал source и target? Вы пытаетесь сопоставить ALL_LOANS с 4 разными целями..   -  person Sjaak    schedule 05.09.2020
comment
небольшое примечание: вы можете пропустить множественное число @ValueMappings в java8, что сделает ваше отображение (немного) более компактным   -  person Sjaak    schedule 05.09.2020


Ответы (2)


В своем вопросе вы говорите, что не можете сопоставить PERS_LOANS, MARGIN_LOANS и т. д. с ALL_LOANS. Однако ваши сопоставления значений меняются местами. Вы сопоставляете ALL_LOANS с PERS_LOANS.

Невозможно сопоставить одно значение перечисления (источник) с несколькими значениями перечисления (цель). Однако можно сопоставить несколько значений перечисления (источника) с одним и тем же значением перечисления (целевое).

person Filip    schedule 01.09.2020

Вы должны реализовать это самостоятельно, потому что 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;
    } 
 }
person Gajek    schedule 31.08.2020