ModelMapper - 无法实例化目标实例

ana*_*ius 5 java mongodb modelmapper

我正在使用 mongodb,所以我将实体与创建 DTO(使用休眠验证器注释)的表示层分离。

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(){}
    //...
Run Code Online (Sandbox Code Playgroud)

我正在尝试从 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;
    }
    /...
Run Code Online (Sandbox Code Playgroud)

像这样:

return mapper.map((UserType1) entity,UserType1DTO.class);
Run Code Online (Sandbox Code Playgroud)

我收到关于无法实例化的错误 ResumeDTO

Failed to instantiate instance of destination *.dto.ResumeDTO. Ensure that *.dto.ResumeDTO has a non-private no-argument constructor.
Run Code Online (Sandbox Code Playgroud)

ResumeDTO 类似于 UserDTO,是一个抽象类,对于每个用户类型都有具体的类。它们都有没有参数的构造函数。问题是什么?

Pau*_*Pau 5

您试图将具体类映射到抽象类,这是行不通的。您不能使用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)*/
Run Code Online (Sandbox Code Playgroud)

您必须使用扩展抽象类的具体类

public class ConcreteClass extends AbstractClass {
       //
}
Run Code Online (Sandbox Code Playgroud)

然后将其映射到这个具体类:

mapper.map(entity, ConcreteClass.class);
Run Code Online (Sandbox Code Playgroud)

更多信息:

由于无法实例化抽象类,因此它也无法在目标属性中工作。

Github 上有一个与此相关的问题:https ://github.com/jhalterman/modelmapper/issues/130