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())と同一であることに注意してください。
このメソッドは、渡されたオブジェクトが 「デフォルトのメッセージ」 を持っている場合、それを返してくれるメソッドだと読み取れる。
じゃあ「デフォルトのメッセージ」ってなんなんだろう?