Условное отображение в mapstruct - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть dto от Джексона и его база данных обновлений с orm hibernate:

class dto {

string f1;
bool isModifiedF1;

string f2;
bool isModifiedF2;

setF1(str s) {
this.isModifiedF1 = true;
this.f1 = s;
}

setF2(str s) {
this.isModifiedF2 = true;
this.f2 = s;
}

//othre setter like that
}

Мне нравится иметь такие вот такие вот:

classMpperImpl {

modify(dto , entity) {

if(dto.isModifedF1){
entity.setF1(dto.getF1);
}

if(dto.isModifedF2){
entity.setF1(dto.getF2);
}

//and other method

}


}

как это сделать?я блокирую soulotion для работы со всеми полями, и пока я просто игнорирую это важное поле, которое мне нужно, и устанавливаю его вручную с помощью @AfterMapping. Мне нужно избегать любого неагрессивного поля в спящем режиме, как casade create field ...

спасибовы

1 Ответ

0 голосов
/ 14 сентября 2018

MapStruct имеет понятие проверки присутствия. Подробнее в разделе Проверка наличия источника справочной документации.

На самом деле вам нужно использовать что-то вроде hasF1, и MapStruct вызовет этот метод. Для вашего конкретного примера это будет выглядеть так:

class Dto {

    private string f1;
    private boolean isModifiedF1;

    private string f2;
    private boolean isModifiedF2;

    public boolean hasF1() {
        return isModifiedF1;
    }

    public void setF1(str s) {
        this.isModifiedF1 = true;
        this.f1 = s;
    }

    public boolean hasF2() {
        return isModifiedF2;
    }

    public void setF2(str s) {
        this.isModifiedF2 = true;
        this.f2 = s;
    } 

    // Others
}

И тогда в сгенерированном коде MapStruct будет делать что-то вроде

class DtoMapperImpl {

    public void modify(Dto dto, Entity entity) {

    if(dto.hasF1()){
        entity.setF1(dto.getF1());
    }

    if(dto.hasF2()){
        entity.setF2(dto.getF2());
    }

    //and other method

}
...