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(){}
    //...

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

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

原文由 anat0lius 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 688
2 个回答

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

原文由 Pau 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

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

它会工作正常。

原文由 Khalid Habib 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏