[Spring boot] ExceptionHandlerでバリデーションエラーのハンドリング、エラー内容の取得

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を返してあげることで実現できます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です