#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