Каков наилучший способ проверки с помощью валидатора, чтобы он не имел дубликатов при выполнении POST?
Я пытался создать собственный валидатор, но всегда получаю Internal Server Error
{"отметка времени": "2020-04-25T14: 37: 19.158 + 0000", "состояние": 500, "ошибка": "Внутренняя ошибка сервера", "сообщение": "HV000030: проверка не может быть найден для ограничения 'com.omega.mtest.validator.IdConstraint', проверяющего тип 'java .lang.Integer'. Проверьте конфигурацию для 'id' "," path ":" / user "}
Это мой класс модели
public class User {
@IdConstraint
@Min(value = 1, message = "ID can't be zero or null")
@Max(value = 1000000, message = "We collect a billion records")
private int id;
@Pattern(regexp = "^[a-zA-Z ]*$", message = "Input doesn't match for a full name")
private String name;
@Min(value = 10)
@Max(value = 120, message = "We didn't expect that age")
private int age;
@Pattern(regexp = "^[a-zA-Z ]*$", message = "Input doesn't match for a city name")
private String city;
public User(int id, String name, int age, String city) {
this.id = id;
this.name = name;
this.age = age;
this.city = city;
}
//getters
}
Пользовательский интерфейс валидатора:
@Constraint(validatedBy = UserValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RUNTIME)
public @interface IdConstraint {
String message() default "The input list cannot contain two ugual IDs";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Реализация класса интерфейса
public class UserValidator implements ConstraintValidator<IdConstraint, List<User>> {
@Override
public void initialize(IdConstraint constraintAnnotation) {
}
@Override
public boolean isValid(List<User> users, ConstraintValidatorContext context) {
if (users.size() == 1) {
return true;
} else {
for (int i = 0; i < users.size(); i++) {
for (int j = 0; j < users.size(); j++) {
if (i != j) {
if (users.get(i).getId() == users.get(j).getId()) {
return true;
}
}
}
}
return false;
}
}
Класс контроллера:
@Validated
@RestController
public class UsersController {
@Autowired
public UserService userService;
@RequestMapping(value = "/user", method = RequestMethod.POST)
public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
return new ResponseEntity<>(userService.createUser(user), HttpStatus.CREATED);
}
@ExceptionHandler(ConstraintViolationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
ResponseEntity<String> handleConstraintViolationException(ConstraintViolationException e) {
return new ResponseEntity<>("Not valid due to validation error: " + e.getMessage(), HttpStatus.BAD_REQUEST);
}
@RequestMapping(value = "/users", method = RequestMethod.GET)
public List<User> getUsers() {
return userService.getAllUsers();
}
@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
public User getUserById(@PathVariable int id) {
return userService.findUserById(id);
}
}
UserService
public interface UserService {
List<User> getAllUsers();
User createUser(User user);
User findUserById(int id);
List<User> list();
}
Репо
@Component
public class UserRepository implements UserService {
private List<User> users;
public UserRepository() {
users = new ArrayList<>();
}
@Override
public List<User> getAllUsers() {
return users.stream().collect(Collectors.toList());
}
@Override
public User createUser(User user) {
users.add(user);
return user;
}
@Override
public User findUserById(int id) {
return users.stream()
.filter(t -> t.getId() == id)
.findAny()
.orElse(null);
}
@Override
public List<User> list() {
return users;
}
}