1. @Valid,@Validated를 사용할때 주의점
@PostMapping
public String addReview(@Validated @RequestBody AddReviewReq addReviewReq, BindingResult bindingResult) {
reviewService.addReview(addReviewReq);
return "success";
}
만약 다음과 같이 BindingResult를 매개변수로 받기로 했다면
스프링은 Bean Validation을 사용한 검증이 실패하더라도 BindingResult에 에러만 담아주고 메소드를 실행시켜준다.
즉 메소드안에서 에러에 대한 후처리를 해야만한다.
그게 아니고 @ControllerAdvice에서 예외에 대한 핸들러로 처리하고싶다면
BindingResult를 매개변수로 받지않게해서
MethodArgumentNotValidException
해당 예외가 발생하게해서 핸들러가 동작하게 해야한다.
@Valid,@Validated가 있는 메소드에서 BindingResult를 파라미터로 받지않으면
필드에러,바인딩에러(매핑에러)가 발생했을때 예외가 발생한다.
2. handler 잘 사용하기
MethodArgumentNotValidException
를 처리해서 Bean Validation의 검증처리에 대한 예외 처리를 잘 해왔다.
MethodArgumentTypeMismatchException
를 처리해서 int인데 String이 들어오거나 하는 primitive 타입 변수들의 대한 예외처리를 해왔다.
그런데 만약 Long userId 에다가 "hi"라고 입력을 보내면
HttpMessageNotReadableException
에러가 발생한다.
JSON parse error: Cannot deserialize value of type `java.lang.Long` from String "hi": not a valid `java.lang.Long` value
@NotNull이라는 검증은 통과하였지만 , @ReuqestBody을 진행하던중 http메시지컨버터에서 json을 객체로 바꾸던중 오류가 발생한것이다. Bean Validtion으로 해결하지못하고, 예외처리 핸들러를 이용했다.
'Backend > Spring' 카테고리의 다른 글
| 서버사이드 렌더링 프로젝트 파일위치 주의점 (0) | 2024.04.16 |
|---|---|
| DTO 정리 (0) | 2023.02.01 |
| insert할때 자동으로 생성되는 키값 가져오기 [미완] (0) | 2023.02.01 |
| Spring) 등록된 Bean 확인하기 (0) | 2023.01.31 |
| Spring] 예외처리 (@ExceptionHandler , @ControllerAdvice,@RestControllerAdvice), 에러코드,실제 적용 (0) | 2023.01.24 |