У меня есть проект с Spring Boot, и я хочу показать ответ об ошибке, если указанный формат даты неверен. Правильный формат: гггг-ММ (java .time.YearMonth), но я хочу показать сообщение, если кто-то отправит 2020-13, 2020-111 или 2020-1.
Когда я добавил пользовательский валидатор, отладчик отправляет туда правильный запрос, но не неправильный запрос. Я также пытался использовать message.properties с typeMismatch.project.startdate=Please enter a valid date.
, но я также не вижу это сообщение в своем теле ответа. Кажется, что приложение не понимает мой неправильный запрос, а затем всегда выдает BAD REQUEST с пустым телом, что не странно, потому что это недопустимая дата.
Может кто-нибудь объяснить мне, как я могу показать сообщение об ошибке в ответе для этих неправильных значений? Или нет другого способа, кроме как использовать String и преобразовать его в объект YearMonth, чтобы я мог показать catch и показать сообщение об ошибке?
Объект запроса:
@Getter
@Setter
public class Project {
@NotNull(message = "mandatory")
@DateTimeFormat(pattern = "yyyy-MM")
private YearMonth startdate;
}
Контроллер:
@RestController
@RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public class ProjectController {
@PostMapping(value = "/project", consumes = MediaType.APPLICATION_JSON_VALUE)
public Project newProject(@Valid @RequestBody Project newProject) {
return projectService.newProject(newProject);
}
}
ExceptionHandler:
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@SneakyThrows
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
headers.add("Content-Type", "application/json");
ObjectMapper mapper = new ObjectMapper();
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach(error -> {
String name;
if (error instanceof FieldError)
name = ((FieldError) error).getField();
else
name = error.getObjectName();
String errorMessage = error.getDefaultMessage();
errors.put(name, errorMessage);
});
return new ResponseEntity<>(mapper.writeValueAsString(errors), headers, status);
}
}