Validaion¶
@Configuration
public class ValidatorConfig {
@Bean
public Validator validator() {
ValidatorFactory factory = Validation.byProvider(HibernateValidator.class)
.configure()
// Установить fail_fast в true, если вы хотите проверить все, установить в false или отменить настройку
.addProperty("hibernate.validator.fail_fast", "true")
.buildValidatorFactory();
return factory.getValidator();
}
}
public class User {
@NotBlank(message = "Имя пользователя не может быть пустым")
private String name;
@Max(value = 120, message = "Возраст не может превышать 120 лет")
private int age;
@NotNull
@Size(min = 8, max = 20, message = "Пароль должен быть больше 8 цифр и меньше 20 цифр")
private String password;
@Email(message = "Пожалуйста, введите почтовый ящик, который соответствует формату")
private String email;
}
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping
public User addUser(@Valid @RequestBody User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
}
return user;
}
}
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResultInfo<?> validationErrorHandler(MethodArgumentNotValidException ex) {
// То же самое, чтобы получить объект BindingResult, а затем получить сообщение об ошибке
// Если fail_fast был включен ранее, фактически будет только одно сообщение
// Если нет, может быть больше
List<String> errorInformation = ex.getBindingResult().getAllErrors()
.stream()
.map(ObjectError::getDefaultMessage)
.collect(Collectors.toList());
return new ResultInfo<>(400, errorInformation.toString(), null);
}
}
public class ResultInfo<T> {
private int code;
private String message;
private T body;
public ResultInfo(int code, String message, T body) {
this.code = code;
this.message = message;
this.body = body;
}
public ResultInfo(int code, String message) {
this(code, message, null);
}
public ResultInfo(String message) {
this(200, message, null);
}
}
{
"code": 400,
"message": "Пароль должен содержать более 8 цифр и менее 20 цифр",
"body": null
}