我正在与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中存在一个问题:
当您在setter和getter中具有原始数据类型或原始返回类型或参数化的构造函数
时发生此错误因此,在这里您需要删除以下代码
public UserType1DTO(String firstName, String lastName, ContactInfoDTO contact,
CompanyDTO company) {
super(UserType.type1, firstName, lastName, contact);
this.company = company;
}
它可以正常工作。
解决我的问题的方法是使用Typemap和更新ModelMapper的版本。请参阅以下链接: -
用ModelMapper映射列表
使用TypeMap仍然给我同样的错误。然后,我将ModelMapper版本从2.0.0
更新为2.3.5
,并解决了问题。
我也得到了同样的例外。我解决的方式成为目标类的私人构造函数。
ViewDTO viewDto = (new ModelMapper()).map(object, ViewDTO.class);
"对象"是域对象,要映射到ViewDTO,这是要发送到客户端的DTO对象。
我刚刚在ViewDTO类中添加了一个私人构造函数。
private ViewDTO() {}
这解决了我的问题。经过验证的答案也有很大帮助。
希望这很有帮助。