Springboot показывает сообщение об ошибке для недопустимых форматов даты (YearMonth): например, 2020-15 - PullRequest
1 голос
/ 03 апреля 2020

У меня есть проект с 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);
    }
}
...