인프런 커뮤니티 질문&답변

Min04님의 프로필 이미지

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

@ControllerAdvice

@Bean Validation이 던지는 예외 메세지를 @ExceptionHandler에 이쁘게 받는법

작성

·

179

·

수정됨

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

Bean Validation과 @ExceptionHandler을 같이 사용하여 REST API를 작성하길 희망해서 아래와 같이 코드를 작성했습니다.

#회원가입 DTO

@Setter 
@Getter 
public class JoinDTO { 
    @NotBlank(message = "아이디는 필수값입니다.") 
    private String username; 
    @NotBlank(message = "패스워드는 필수값입니다.") 
    private String password; 
}

#회원가입 컨트롤러

 @PostMapping("/join") 
public String joinProcess(@RequestBody @Validated JoinDTO joinDTO) { 
    회원가입하는 로직이 들어있습니다. 
}

#ExControllerAdvice에 MethodArgumentNotValidException예외 처리 추가

@ResponseStatus(HttpStatus.BAD_REQUEST) 
@ExceptionHandler 
public ErrorResult userExHandle2(MethodArgumentNotValidException e) { 
    return new ErrorResult("join-ex", e.getMessage()); 
} 

 

이상황에서 postman을 통해 password를 빼고 보내면 아래와 같이 응답값이 나오는데요.

{ 
"code": "join-ex", 
"message": "Validation failed for argument [0] in public java.lang.String aaa.bbb.controller.JoinController.joinProcess(aaa.bbb.dto.JoinDTO): [Field error in object 'joinDTO' on field 'password': rejected value [null]; codes [NotBlank.joinDTO.password,NotBlank.password,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [joinDTO.password,password]; arguments []; default message [password]]; default message [패스워드를 입력해주세요]] " 
}

제가 원한건 아래 형태입니다

{ 
"code": "join-ex", 
"message": "패스워드를 입력해주세요" 
}

깔끔하게 Bean Validation에서 보낸 message를 받는 방법이 없을까요?(e.getXxx메서드들 다 찍어보았는데 원하는 결과가 안나오네요 ㅠ) 

답변 1

1

안녕하세요. Min04님, 공식 서포터즈 y2gcoder입니다.

MethodArgumentNotValidException 과 BindException(상위 예외) 들은 전부 bindingResult 객체를 내부에 가지고 있습니다.

그래서 exception.getBindingResult() 로 bindingResult 를 가져오시면 그 안에 있는 fieldError들을 가져올 수 있습니다. 해당 방법을 이용해서 원하시는 예외 메시지를 호출하실 수 있습니다 🙂

다음 링크(클릭) 도 참고해보시면 좋을 것 같습니다!

 

감사합니다.

Min04님의 프로필 이미지
Min04
질문자

항상 감사드립니다!

Min04님의 프로필 이미지

작성한 질문수

질문하기