Не удалось создать экземпляр целевого пользователя. Убедитесь, что у пользователя есть не закрытый конструктор без аргументов - SpringBoot

Я работаю над приложением SpringBoot, открывающим некоторые конечные точки, которые не возвращают исходные объекты, но возвращают свои DTO. Чтобы сопоставить все сущности, с которыми я работаю, использую версию org.modelmapper: 2.3.8 и проект Lombok, чтобы избежать использования геттеров, сеттеров и некоторых других утилит.

Это исходные сущности (я удалил некоторые свойства и аннотации 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);
    }

Я пытаюсь создать нового пользователя, отправив JSON с помощью Postman. Я отправляю список пользователей, потому что хочу иметь возможность сохранять несколько пользователей одновременно, и я пытаюсь сопоставить его как

modelMapper.map(newUsersDto, User.class)

Но я получаю следующую ошибку:

"ModelMapper mapping errors:\n\n1) Failed to instantiate instance of destination com.app.entity.User. Ensure that com.app.entity.User has a non-private no-argument constructor.\n\n1 error"

Я не знаю, как лучше всего сопоставить подклассы.

Вы упомянули, что используется Ломбок. Где аннотации Ломбока? Было бы полезно, если бы вы показали нам, что вы делаете с Ломбоком. В противном случае сложно сказать, что идет не так.

Marcos Barbero 09.04.2021 17:13

Привет, я обновил свой вопрос, взгляните.

user9347049 09.04.2021 17:17

Я не знаю Lombok, но, судя по быстрому поиску в Google, добавление @NoArgsConstructor не решит эту проблему?

Marek 09.04.2021 17:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
21
0

Другие вопросы по теме