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는 폼로그인 시에 발생하는 바인딩 에러다