트러플 슈팅

김파란·2024년 11월 18일

project

목록 보기
4/9

1. 바인딩 처리

1). BindingResult

  • RestController에서 Bind처리를 전역적으로 하고 싶었다
  • 하지만 @Valid @RequestBody ItemCreateReqDto createReqDto, BindingResult bindingResult을 하게된다면 BindingResult가 에러처리를 받기 때문에 @ExceptionHandler까지 오지 않는다
  • AOP를 이용한다면 BindingResult를 사용해도 되지만 ExceptionHandler를 안된다
@PostMapping("/post")
    public ResponseEntity<?> createItem(@Valid @RequestBody ItemCreateReqDto createReqDto, BindingResult bindingResult) {
        Item savedItem = itemService.create(createReqDto);
        return new ResponseEntity<>(ItemCreateRespDto.from(savedItem), HttpStatus.CREATED);
    }

@RestControllerAdvice
public class CustomValidationHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<?> handleBindException(MethodArgumentNotValidException e) {
        List<String> errors = e.getBindingResult()
                .getFieldErrors()
                .stream()
                .map(f -> f.getField() + " " + f.getDefaultMessage())
                .toList();
        return new ResponseEntity<>(new ResponseDto<>(-1, e.getMessage(), errors), HttpStatus.BAD_REQUEST);
    }
}

2). RequestBody의 바인딩에러

  • RequestBody의 바인딩 에러는 MethodArgumentNotValidException.class이다
  • BindException.class는 폼로그인 시에 발생하는 바인딩 에러다

0개의 댓글