Open3

messageSourceのgetMessageメソッドの引数にオブジェクトを使う方法

ふじしろふじしろ

概要

Spring バリデーションエラーを@ControllerAdviceで一括ハンドリング - Qiita
こちらの記事の例外ハンドラクラスの項目で使われていたgetMessageメソッドの使い方を学ぶためのスクラップ

該当箇所

/**
 * コントローラで発生した例外のハンドラ
 */
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @Autowired
    MessageSource messageSource;

    /**
     * {@link BindException}をハンドリング
     *
     * @param bindException {@link BindException}
     * @param httpHeaders   {@link HttpHeaders}
     * @param httpStatus    {@link HttpStatus}
     * @param webRequest    {@link WebRequest}
     * @return クライアントへのレスポンス
     */
    @Override
    protected ResponseEntity<Object> handleBindException(
            BindException bindException,
            HttpHeaders httpHeaders,
            HttpStatus httpStatus,
            WebRequest webRequest
    ) {
        // レスポンスボディに格納するエラーリスト
        List<ApiError> apiErrorList = new ArrayList<>();

        List<ObjectError> objectErrorList = bindException.getAllErrors();

        for (ObjectError objectError : objectErrorList) {

            // エラーコードからメッセージ取得
            String message = messageSource.getMessage(objectError, webRequest.getLocale());

            // レスポンスボディ用エラーオブジェクトを作成しリストに格納
            ApiError apiError = new ApiError();
            apiError.setMessage(message);
            apiErrorList.add(apiError);
        }

        return new ResponseEntity<>(apiErrorList, httpHeaders, httpStatus);
    }
}
ふじしろふじしろ

気になっているのは、以下の部分。

 // エラーコードからメッセージ取得
String message = messageSource.getMessage(objectError, webRequest.getLocale());

ここではgetMessage(ObjectError, Locale)という形になっている。
getMessageは、メッセージが存在するオブジェクトを第一引数に入れると、そのメッセージを勝手に取得してくれるのか?

ドキュメントでは第一引数にresolvableとして、MessageSourceResoulvaleを引数に持っている。

このMessageSourceResoulvaleのドキュメントも見てみると、3つメソッドを持っており、そのうち、getDefaultMessage()が今回の処理を解決しているものと思われる。

このメソッドの説明は以下の通り。

このメッセージを解決するために使用されるデフォルトのメッセージを返します。
デフォルトの実装は、単に null を返します。デフォルトのメッセージは、この特定のメッセージに対して AbstractMessageSource.setUseCodeAsDefaultMessage(boolean) を効果的に実施するプライマリメッセージコード(getCodes())と同一であることに注意してください。

このメソッドは、渡されたオブジェクトが 「デフォルトのメッセージ」 を持っている場合、それを返してくれるメソッドだと読み取れる。

じゃあ「デフォルトのメッセージ」ってなんなんだろう?