ModelMapper - 无法实例化目标

时间:2017-03-02 09:19:04

标签: java mongodb modelmapper

我正在使用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,是一个抽象类,每个用户类型都有具体的类。他们都有没有参数的构造函数。 有什么问题?

3 个答案:

答案 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,问题解决了。