Пусть Spring ответит 400 (вместо 500) в случае ошибки проверки заголовка запроса - PullRequest
0 голосов
/ 27 февраля 2019

При использовании проверки параметров Spring MVC @RequestMapping метод Spring отвечает различными кодами состояния в зависимости от типа параметра:

  • Для недопустимых параметров @RequestBody Spring отвечаетс 400
  • Для недопустимых параметров @RequestHeader, @PathVariable и @RequestParam Spring отвечает 500.

Можно ли это изменить, чтобы Spring ответил тем же 400ответ во всех случаях?


Это мой код:

@Controller
@Validated
public class WebController {

    @RequestMapping(method = RequestMethod.POST, path = "/action")
    public ResponseEntity<String> doAction(
            @RequestHeader("Header-Name") @Valid LatinString headerValue,
            @RequestBody @Valid Struct body) {
        return new ResponseEntity<>(HttpStatus.OK);
    }
}
public class LatinString {

    @Pattern(regexp = "[A-Za-z]*")
    private String value;

    public LatinString(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}
public class Struct {

    @Pattern(regexp = "[A-Za-z0-9.-]{1,255}")
    private String domain;

    public String getDomain() {
        return domain;
    }
}

1 Ответ

0 голосов
/ 27 февраля 2019

Я понял, что можно получить правильный код состояния (400), обработав тип исключения ConstraintViolationException.Для этого необходимо добавить следующий код в @Controller или @ControllerAdvice:

    @ExceptionHandler(ConstraintViolationException.class)
    public ResponseEntity<String> onValidationError(Exception ex) {
        return new ResponseEntity<String>(HttpStatus.BAD_REQUEST);
    }

К сожалению, это не включает в себя красивое тело сообщения об ошибке, как для запросов с недействительными @RequestBody, поэтому мне интересно, есть ли лучшее решение.

...