Spring Boot @Valid не отображает сообщение от @NotBlank

#spring #spring-boot #rest #validation #post

#весна #весенняя загрузка #остальное #проверка #Публикация

Вопрос:

Почему сообщение от @NotBlank не отображается?

API контроллера:

 @PostMapping("/create-folder")
public SuccessResponse createFolder(Principal principal, @Valid @RequestBody CreateFolderRequest request) {
    return historyService.createFolder(principal.getName(), request.getFolderName());
}
  

Тело запроса:

 @Data
public class CreateFolderRequest {
    @NotBlank(message = "Folder name is mandatory.")
    private String folderName;
}
  

Ответ JSON:

 {
    "timestamp": "2020-11-18T11:24:19.769 00:00",
    "status": 400,
    "error": "Bad Request",
    "message": "Validation failed for object='createFolderRequest'. Error count: 1",
    "path": "/api/history/create-folder"
}
  

Упаковка:
Допустимо:
import javax.validation.Valid;
NotBlank:
import javax.validation.constraints.NotBlank;

В проекте нет глобальных обработчиков исключений.

Ответ №1:

@Valid выбрасывает исключение из MethodArgumentNotValidException, которое вы вводите в @NotBlank, — это выбросить внутри детали исключения, которая не возвращается клиенту. вам необходимо извлечь сообщения, поэтому попробуйте добавить этот метод в контроллер.

 @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Map<String, String> handleValidationExceptions(
            MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getAllErrors().forEach((error) -> {
            String fieldName = ((FieldError) error).getField();
            String errorMessage = error.getDefaultMessage();
            errors.put(fieldName, errorMessage);
        });
        return errors;
    }
  

приведенный выше код считывает все ошибки внутри исключения, затем получает их подробную информацию (filedName — ErrorMessage) и помещает их в список, а затем возвращает список в clinet со статусом 400 bad request