Programing/Framework
[Spring] FieldError의 계층구조
나모찾기
2020. 8. 20. 22:08
스프링 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()