ModelMapper - не удалось создать экземпляр назначения

2

Я работаю с mongodb, поэтому я развязываю объекты из уровня представления, создавая DTO (с аннотациями hibernate-validator).

public abstract class UserDTO {

    private String id;      
    @NotNull
    protected String firstName;
    @NotNull
    protected String lastName;
    protected UserType type;
    protected ContactInfoDTO contact;
    protected List<ResumeDTO> resumes;

    public UserDTO(){}
    //...

Я пытаюсь извлечь из db этот конкретный класс

public class UserType1DTO extends UserDTO {

    private CompanyDTO company;

    public UserType1DTO(){
        super();
    }

    public UserType1DTO(String firstName, String lastName, ContactInfoDTO contact, CompanyDTO company) {
        super(UserType.type1, firstName, lastName, contact);
        this.company = company;
    }
    /...

Как это:

return mapper.map((UserType1) entity,UserType1DTO.class);

И я получаю эту ошибку из-за того, что я не могу ResumeDTO

Failed to instantiate instance of destination *.dto.ResumeDTO. Ensure that *.dto.ResumeDTO has a non-private no-argument constructor.

ResumeDTO похож на UserDTO, является абстрактным классом и имеет конкретные классы для каждого типа пользователя. Все они имеют конструкторы без аргументов. В чем проблема?

Теги:
modelmapper

1 ответ

1
Лучший ответ

Вы пытаетесь сопоставить конкретный класс с абстрактным классом, это не сработает. Вы не можете использовать в качестве адресата Abstract Class. Зачем? Он не может быть создан. Поэтому вы должны использовать конкретный класс

Изначально он не работал бы с картой с назначением абстрактного класса:

mapper.map(entity, AbstractClass.class);
/*Error: java.lang.InstantiationException
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)*/

Вы должны использовать конкретный класс, который расширяет абстрактный класс

public class ConcreteClass extends AbstractClass {
       //
}

А затем сопоставьте его с этим конкретным классом:

mapper.map(entity, ConcreteClass.class);

Больше информации:

Из-за невозможности навязывания абстрактного класса он не будет работать в свойствах проецирования.

В Github есть проблема, связанная с этим: https://github.com/jhalterman/modelmapper/issues/130

  • 0
    Это то, что я делаю, не так ли? return mapper.map((UserType1) entity,UserType1DTO.class); UserType1 и UserType1DTO являются конкретными классами.
  • 0
    Какая именно ошибка? Обратите внимание, что у меня есть атрибут списка ResumeDTO в моем абстрактном классе, и я получаю ошибку об этом атрибуте Failed to instantiate instance of destination *.dto.ResumeDTO. Ensure that *.dto.ResumeDTO has a non-private no-argument constructor не говорит мне ничего о невозможности создания абстрактных классов
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню