我正在使用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,是一个抽象类,每个用户类型都有具体的类。他们都有没有参数的构造函数。 有什么问题?
答案 0 :(得分: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)*/
您必须使用扩展Abstract Class
的具体类public class ConcreteClass extends AbstractClass {
//
}
然后将其映射到这个具体的类:
mapper.map(entity, ConcreteClass.class);
更多信息:
由于无法实例化抽象类,因此它在desination属性中也不起作用。
Github中存在与此相关的问题:https://github.com/jhalterman/modelmapper/issues/130
答案 1 :(得分:0)
当您在setter和getter或参数化构造函数中具有原始数据类型或原始返回类型时,会发生此错误
所以在这里您需要删除以下代码
'FindName': function() {
var tableName = "CVRaman";
var userName = "Prateek";
var userId = "kapoor";
const dynamodbParams = {
TableName: tableName,
Key: {
userId: userId,
userName: userName,
},
ProjectionExpression: 'userName', //Projection Expression is used to select only specific columns which we want to get
};
console.log("Attempting to find name", dynamodbParams);
dynamoDb.get(dynamodbParams).promise()
.then(data => {
console.log('name found', dynamodbParams);
console.log(data.Item.userName);
var a = data.Item.userName;
console.log(a);
this.emit(':ask', 'Name as ' + a);
})
.catch(err => {
console.log(err);
this.emit(':tell', 'we have a problem');
});
},
它将正常工作。
答案 2 :(得分:0)
解决我的问题的是使用 typeMap 并更新 ModelMapper 的版本。请参考以下链接:-
Mapping Lists with ModelMapper
使用 typeMap 仍然给我同样的错误。然后我将 ModelMapper 版本从 2.0.0
更新为 2.3.5
,问题解决了。