7

我正在使用 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(){}
    //...

我正在尝试从数据库中检索这个具体的类

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

4

3 回答 3

4

您正在尝试将具体类映射到抽象类,这是行不通的。您不能将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

于 2017-03-02T11:37:50.257 回答
0

当您在 setter 和 getter 或参数化构造函数中具有原始数据类型或原始返回类型时,会发生此错误

所以在这里你需要删除以下代码

public UserType1DTO(String firstName, String lastName, ContactInfoDTO contact, 
CompanyDTO company) {
    super(UserType.type1, firstName, lastName, contact);
    this.company = company;
}

它会正常工作。

于 2019-08-22T10:31:05.240 回答
0

解决我的问题是使用 typeMap 并更新 ModelMapper 的版本。请参考以下链接:-

使用 ModelMapper 映射列表

使用 typeMap 仍然给了我同样的错误。然后我将我的 ModelMapper 版本从 更新2.0.02.3.5,问题就解决了。

于 2021-01-27T08:26:49.447 回答