Сопоставить абстрактный класс с DTO с помощью MapStruct - PullRequest
0 голосов
/ 26 марта 2020

Я нашел много тем для этого, но все решения пошли в неправильном направлении в моих глазах.

Итак ... Как мне использовать отображение MapStruct для этого случая?

аннотация класс Person:

public abstract class Person implements Serializable{

     private String name;
     private String somethingToIgnore

     //Getter and Setter

}

Обычный Mapper не работает:

@Mapper(componentModel = 'cdi')
public interface PersonMapper{

    @Mapping(target = 'somethingToIgnore', ignore = 'true')
    Person toPerson(PersonDTO source);

    @InheritInverseConfiguration
    PersonDTO toPersonDtO(Person source);

}

Мне не разрешено отображать абстрактный класс. Я должен использовать фабричный метод. Я пытался, но я просто понятия не имею, как должен выглядеть этот метод factoy ...

Моя попытка:

@Mapper
public interface PersonMapper {

    PersonMapper INSTANCE = Mappers.getMapper( PersonMapper.class );

    Person toPerson(PersonDTO source);

    PersonDTO toPersonDtO(Person source);
}

@Mapper
public abstract class PersonMapper {

    public static final PersonMapper INSTANCE = Mappers.getMapper( PersonMapper.class );

    Person toPerson(PersonDTO source);

    PersonDTO toPersonDtO(Person source);
}

Что я пропускаю и делаю неправильно? Заранее спасибо.

1 Ответ

2 голосов
/ 27 марта 2020

MapStruct не знает, как отобразить абстрактный класс, потому что не может создать его экземпляр. Я ожидаю, что у вас есть реализация Person. Вам необходимо предоставить метод, который будет создавать объект Person, например:

@Mapper
public interface PersonMapper {

    Person toPerson(PersonDTO source);

    PersonDTO toPersonDtO(Person source);

    default Person createPerson() {
        return new PersonImpl();
    }
}

Таким образом MapStruct будет использовать этот метод для создания Person экземпляра и затем сопоставлять свойства, как обычно. Вы можете найти больше об объектных фабриках в документации .

...