Я работаю с 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, является абстрактным классом и имеет конкретные классы для каждого типа пользователя. Все они имеют конструкторы без аргументов. В чем проблема?
Вы пытаетесь сопоставить конкретный класс с абстрактным классом, это не сработает. Вы не можете использовать в качестве адресата 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
return mapper.map((UserType1) entity,UserType1DTO.class);
UserType1 и UserType1DTO являются конкретными классами.
Failed to instantiate instance of destination *.dto.ResumeDTO. Ensure that *.dto.ResumeDTO has a non-private no-argument constructor
не говорит мне ничего о невозможности создания абстрактных классов