mongodb ModelMapper -无法示例化目标的示例

dl5txlt9  于 2022-12-18  发布在  Go
关注(0)|答案(3)|浏览(106)

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

iibxawm4

iibxawm41#

您正尝试将一个具体类Map到一个抽象类,这将不起作用。您不能将Abstract Class用作目标。为什么?它不能被示例化。因此您必须使用一个具体类。
毫无疑问,它不能用于带有抽象类目的地的Map:

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 {
       //
}

然后将其Map到这个具体类:

mapper.map(entity, ConcreteClass.class);


更多信息:
由于不可能示例化抽象类,因此它在目标属性中也不起作用。
Github中有一个与此相关的问题:https://github.com/jhalterman/modelmapper/issues/130

roejwanj

roejwanj2#

当setter和getter或参数化构造函数中具有基元数据类型或基元返回类型时,会发生此错误
因此,您需要在此处删除以下代码

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

它会工作得很好。

f0brbegy

f0brbegy3#

解决我的问题是使用typeMap和更新ModelMapper的版本。请参考以下链接:-
Mapping Lists with ModelMapper
使用typeMap仍然给我同样的错误。然后我将我的ModelMapper版本从2.0.0更新到2.3.5,问题解决了。

相关问题