ExceptionHandlerでバリデーションエラーをハンドリング、バリデーションエラー内容を取得する実装について書いていきます。
目次
ExceptionHandlerでバリデーションエラー処理をハンドリング
Controllerの共通した例外ハンドリングは、@RestControllerなら@RestControllerAdviceのアノテーションを付与してResponseEntityExceptionHandlerを継承することでできます。
通常の@Controllerなら@ControllerAdviceになります。
バリデーションエラーのハンドリングはhandleMethodArgumentNotValidメソッドを継承することで実装できます。
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
@RestControllerAdvice
public class ExceptionHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
// バリデーションエラー時はこのメソッドが実行されるようになる
return super.handleMethodArgumentNotValid(ex, headers, status, request);
}
}
バリデーションのエラー内容を取得する
MethodArgumentNotValidException#getFieldErrors()にフィールドごとのエラーが格納されています。
フィールド名とメッセージFieldError#getField()、FieldError#getDefaultMessage()で取得できます。
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
for (FieldError e : ex.getFieldErrors()) {
logger.error(e.getField() + " : " + e.getDefaultMessage());
}
return super.handleMethodArgumentNotValid(ex, headers, status, request);
}
バリデーションエラーを独自のレスポンス形式にしたい場合はhandleMethodArgumentNotValidメソッドでバリデーションエラー内容から作成したResponseEntityを返してあげることで実現できます。