본문 바로가기
개발아닌개발/springboot

간단하게 @Valid 예외 처리 exception handler 만들기

by 불청객 2023. 8. 9.
반응형

@Valid 예외에 걸리면, ajax에서 POST 요청에 대한 응답코드는 400

 

 

디버그 내용

2023-08-09 13:33:58.732  WARN 4104 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public org.springframework.http.ResponseEntity<com.modim.spring.global.response.dto.Response> co m.modim.spring.domain.member.controller.MemberController.join(com.modim.spring.domain.member.dto.MemberDto$RequestDto): [Field error in object 'requestDto' on field 'loginPassword': rejected value [1234]; codes [Length.requestDto.loginPassword,Length.loginPassword,Length.java.lang.String,Length]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [requestDto.loginPassword,loginPassword]; arguments []; default message [loginPassword],16,6]; default message [비밀번호는 6자 이상, 16자 이하로 입력해주십시오.]] ]

 

java

@ControllerAdvice
@RestController
public class ValidException {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Response> processValidationError(MethodArgumentNotValidException exception) {
        BindingResult bindingResult = exception.getBindingResult();

        ArrayList<String> arrayList = new ArrayList<String>();
        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            arrayList.add(fieldError.getDefaultMessage());
        }
        return ResponseEntity.ok(Response.error(arrayList));
    }
}

* Response : response DTO객체

* valid 에 걸리는 칼럼이 2개이상 일수 있으니, for문으로 ArrayList에 @Valid에 대한 Message를 담아서 반환하도록 함.

 

 

위 파일을 생성해두면, @Valid 예외 발생 시에 이쪽 코드를 탄다..

post mapping된 메소드에  @Valid는 파라미터에 있는 어노테이션이라 당연하게도 중단점이 걸리지않는다.

그래서 예외 발생시 만들어놓은 위 함수에 걸린다.

 

Exception handler 는 어렵다고 생각했는데 디버그 내용도 참고해보니 퍼즐 맞추듯이 이해가 된다

728x90
반응형

댓글