스프링 Controller에서 파라미터 에러가 나면 BindingResult 로 바인딩 결과를 받아 올 수 있다.
@RestController
@RequestMapping(value = "/some")
public class SomeController {
@PostMapping(value = "/thing")
public ResponseDto<Result> ready(@RequestBody @Valid Params params, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
// ...
}
만약에 결과를 받지 않을 경우 @Valid에서 실패한 것은 MethodArgumentNotValidException 예외가 던져진다.
이 예외 안에는 위의 Controller 예제처럼 BindingResult 이 담겨 있다.
따라서 예외 핸들러에서 아래와 같이 에러 필드에 대한 이터레이션이 가능하다.
@ExceptionHandler({MethodArgumentNotValidException.class})
@ResponseBody
public ResponseEntity<PgApiError> methodArgumentNotValidException(MethodArgumentNotValidException ex) {
final BindingResult bindingResult = ex.getBindingResult();
for (FieldError fieldError : bindingResult.getFieldErrors()) {
// something todo...
}
// ..
참고로 FieldError의 계층구조는 아래와 같다.
FieldError 에서 가져올 수 있는 유용한 것은 문제가 되었던 코드, 필드 이름, 필드에 메시지가 정의되었다면 기본 메시지, 왜 실패했는지를 알 수 있는 값 등이다.
- fieldError.getCode()
- fieldError.getField()
- fieldError.getDefaultMessage()
- fieldError.getRejectedValue()
FieldError : getField(), getRejectedValue()
DefaultMessageSourceResolvable: getCode(), getDefaultMessage()
'Programing > Framework' 카테고리의 다른 글
[JPA] @Converter 는 어떻게 동작할까? (0) | 2020.09.17 |
---|---|
[스프링] 생성자가 private 일때 스프링은 객체는 어떻게 만들까? (0) | 2020.08.25 |
[JPA] H2 테스트 코드에서 createdAt 필드가 없던 이유 (0) | 2020.08.20 |
[JPA] N+1 문제 (0) | 2020.06.09 |
[Spring JPA] 멀티컬럼 - 쿼리메소드 vs @Query (0) | 2020.05.26 |