본문 바로가기

Programing/Framework

[Spring] FieldError의 계층구조

스프링 Controller에서 파라미터 에러가 나면 BindingResult 로 바인딩 결과를 받아 올 수 있다.

@RestController
@RequestMapping(value = "/some")
public class SomeController {
    @PostMapping(value = "/thing")
    public ResponseDto<Result> ready(@RequestBody @Valid Params params, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            // ...
        }

만약에 결과를 받지 않을 경우 @Valid에서 실패한 것은 MethodArgumentNotValidException 예외가 던져진다.

이 예외 안에는 위의 Controller 예제처럼 BindingResult 이 담겨 있다.

 

따라서 예외 핸들러에서 아래와 같이 에러 필드에 대한 이터레이션이 가능하다.

    @ExceptionHandler({MethodArgumentNotValidException.class})
    @ResponseBody
    public ResponseEntity<PgApiError> methodArgumentNotValidException(MethodArgumentNotValidException ex) {
        final BindingResult bindingResult = ex.getBindingResult();

        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            // something todo...
        }
        // ..

참고로 FieldError의 계층구조는 아래와 같다.

FieldError 에서 가져올 수 있는 유용한 것은 문제가 되었던 코드, 필드 이름, 필드에 메시지가 정의되었다면 기본 메시지, 왜 실패했는지를 알 수 있는 값 등이다.

  • fieldError.getCode()
  • fieldError.getField()
  • fieldError.getDefaultMessage()
  • fieldError.getRejectedValue()

FieldError : getField(), getRejectedValue()

DefaultMessageSourceResolvable: getCode(), getDefaultMessage()