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

您正在尝试将具体类映射到抽象类,这将行不通。您不能用作目的地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中存在一个问题:

当您在setter和getter中具有原始数据类型或原始返回类型或参数化的构造函数

时发生此错误

因此,在这里您需要删除以下代码

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

它可以正常工作。

解决我的问题的方法是使用Typemap和更新ModelMapper的版本。请参阅以下链接: -

用ModelMapper映射列表

使用TypeMap仍然给我同样的错误。然后,我将ModelMapper版本从2.0.0更新为2.3.5,并解决了问题。

我也得到了同样的例外。我解决的方式成为目标类的私人构造函数。

ViewDTO viewDto = (new ModelMapper()).map(object, ViewDTO.class);

"对象"是域对象,要映射到ViewDTO,这是要发送到客户端的DTO对象。

我刚刚在ViewDTO类中添加了一个私人构造函数。

private ViewDTO() {}

这解决了我的问题。经过验证的答案也有很大帮助。

希望这很有帮助。

相关内容

  • 没有找到相关文章

最新更新