当前位置: 首页 > 知识库问答 >
问题:

未能实例化目标用户的实例。确保用户具有非私有的无参数构造函数-springboot

詹唯
2023-03-14

我正在研究一个springboot应用程序,它公开了一些不返回原始实体的endpoint,但它们返回了它们的DTO。为了映射所有的实体,我使用org.modelmapperversion:2.3.8和project Lombok来避免实现getters、setters和其他一些实用程序

这些是源实体(我删除了一些属性和Hibernate注释,因为它们在示例中不是必需的):

user.java

@NoArgsConstructor
@AllArgsConstructor
@ToString
@Getter
@Setter
@Entity(name = "Users")
@ApiModel(description = "All details about user")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "User_Type", discriminatorType= DiscriminatorType.STRING)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "user_type")
@JsonSubTypes({
        @JsonSubTypes.Type(value = Player.class, name = "player"), //non-abstract subtypes of your abstract class

        @JsonSubTypes.Type(value = Coach.class, name = "coach") })
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String firstName;   
    private String lastName;    
    private String username;    
    private String email;    
    private String password;   
    private String contactNumber;
}

Player.java

@NoArgsConstructor
@AllArgsConstructor
@ToString
@Getter
@Setter
@Entity(name = "Players")
@DiscriminatorValue(value = "player")
@DiscriminatorOptions(force=true)
public class Player extends User {

    private String dateOfBirth;
    private String notes;
}

Coach.java

@Entity(name = "Coaches")
@DiscriminatorValue(value = "coach")
@DiscriminatorOptions(force=true)
public class Coach extends User{

}

目标DTO为:

userDTo.java

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "User_Type", discriminatorType= DiscriminatorType.STRING)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "user_type")
@JsonSubTypes({
        @JsonSubTypes.Type(value = PlayerDto.class, name = "player"), //non-abstract subtypes of your abstract class

        @JsonSubTypes.Type(value = CoachDto.class, name = "coach") })
public abstract class UserDto {

    private String firstName;
    private String lastName;
    private String username;
    private String email;
    private String password;
    private String contactNumber;
    private String dateOfBirth;
    private String notes;
}

PlayerDTo.java

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
@DiscriminatorValue(value = "player")
@DiscriminatorOptions(force=true)
public class PlayerDto extends UserDto{

    private String dateOfBirth;
    private String notes;
}

Coach.java

@DiscriminatorValue(value = "coach")
@DiscriminatorOptions(force=true)
public class CoachDto extends UserDto{

}

UserController.java

@PostMapping("/users")
    public void addUsers(@RequestBody List<UserDto> newUsersDto) {
        userService.saveUsers(newUsersDto);
    }

UserService.java

 public void saveUsers(List<UserDto> newUsersDto) {
        List<User> userList = Arrays.asList(modelMapper.map(newUsersDto, User.class));
        userRepository.saveAll(userList);
    }

我试图通过使用Postman发送JSON来创建一个新用户。我正在发送一个用户列表,因为我希望能够一次保存多个用户,并且我正在尝试将其映射为

modelmapper.map(newUsersDto,user.class)

但我得到以下错误:

“ModelMapper映射错误:\n\n1)无法实例化目标com.app.entity.user的实例。请确保com.app.entity.user具有非私有的无参数构造函数。\n\n1错误”

我不知道什么是映射子类的最佳方法

共有1个答案

墨翔宇
2023-03-14

我不知道Lombok,但基于一个快速的谷歌搜索,添加@noargsconstructor难道不会解决这一点吗?

 类似资料:
  • 我正在使用Spring并在“mapper”字段的第一个控制器中遇到问题: 上下文初始化期间遇到异常-取消刷新尝试:org。springframework。豆。工厂UnsatisfiedPendencyException:创建名为“controller”的bean时出错:未满足的依赖项通过字段“mapper”表示;嵌套的异常是org。springframework。豆。工厂BeanCreationE

  • 我正在将应用程序迁移到最新的spring boot版本(使用gradle spring boot dependencies和2.5.4版)。 我有一个名为的实体,它用注释;以及另一个实体,用注释。Customer类有

  • 我试图在谷歌地图中显示一个位置地址,但当我为获取地址启动意向服务时,它将显示错误“无法实例化服务”。 我使用此链接显示位置地址。 这是我的代码: 在这里我开始意图服务:

  • 我的问题和Mockito一样:Mock私有字段初始化,但是对于Google Mock框架。简而言之: 在为类进行单元测试时,如何模拟实例?

  • 问题内容: 我迷失在通用丛林中,请帮助我:)我有这样的事情: 据我认为,编译器应该实现,因为它实现了。 为什么会出现此错误? 我该如何工作? ps:如果您对此有更好的标题,请进行更改。我无法弥补。 问题答案: 问题是,您的构造函数需要一个,并且在您的代码中将其推断为。 因此,您应该通过,然后通过。但是您不能像那样直接传递该实例。 但是,您可以通过将类强制转换为所需实例来解决此问题: 请注意,如何首

  • 鉴于 IntelliJ IDEA 2016.1.1报告“可以替换为方法引用”。 我知道无参数构造函数的< code>Foo::new语法,但是不知道如何将< code>foo作为参数传入。我肯定漏掉了什么。