Я работаю над приложением 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"
Я не знаю, как лучше всего сопоставить подклассы.
Привет, я обновил свой вопрос, взгляните.
Я не знаю Lombok, но, судя по быстрому поиску в Google, добавление @NoArgsConstructor не решит эту проблему?




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