Spring Boot学習⑤～エラーメッセージをプロパティファイルで一元管理する～

前→https://qiita.com/19960417akiho/items/4f89cf51b69125c4cdc9


以下の動画を参考に、ハンズオン形式でSpring BootでWebアプリを制作していきます。

https://www.youtube.com/watch?v=eoRxkHsSn2w

今回はPart11。

エラーメッセージをプロパティファイルで一元管理できるようにします。

まずは、src/main/resorces下に、エラーメッセージを管理するファイルを作ります。

ファイル名は必ず`messages.properties`でないといけません。

このファイルに、キーと値という形式でメッセージを管理していきます。

以下の通りです。

# messages.properties
```
login.wrongInput = ログインIDとパスワードの組み合わせが間違っています。
```

今回は、ログイン失敗時のメッセージをこのファイルから引っ張ってきて表示するような実装を行います。

ファイル作成の次は、`messages.properties`からログインエラーメッセージを引っ張ってくるためのクラスを作成します。

utilパッケージを新しく追加し、その中にAppUtil.javaというクラスを作成します。

# AppUtil.java

``` AppUtil.java
public class AppUtil {
	
	/**
	 * メッセージIDからメッセージを取得する。
	 * 
	 * @param messageSource メッセージソース
	 * @param key メッセージキー
	 * @param params 置換文字群
	 * @return メッセ――ジ
	 */
	public static String getMessage(MessageSource messageSource,String key,Object... params) {
		return messageSource.getMessage(key, params,Locale.JAPAN);
	}

}
```

AppUtilクラス内でgetMessageメソッドを定義しています。

このメソッドは、引数にMessageSource型のmessageSourceとString型のkey,そしてObject型のパラメータをいくつも持つことができる可変長引数が定義されています。

retrunで返すものは、MessageSourceインターフェースが持つメソッドの一つであるgetMessageメソッドにkeyやパラメータの情報を与えたものです。

なぜ、getMessageメソッド内でgetMessageメソッドを使ってるんだろうと思いましたが、
AppUtilクラス内のgetMessageメソッドと、MessageSourceインターフェースの持つgetMessageメソッドは名前は一緒ですが全く別物なので大丈夫なようです。

MessageSourceインターフェースのgetMessageメソッドは、messages.propertiesファイルからメッセージを持ってくるメソッドです。

引数のkeyは、ファイルに用意したlogin.wrongInputなどのことです。

paramはパラメータを使うことで、messages.propertiesに用意したメッセージの一部を変更することができます。（今回は使っていません）

Locale.JAPANは、日本語のメッセージをもってくるよーという指定です。

それでは、AppUtilクラスのgetMessageメソッドをLoginController内で使ってみましょう。

# LoginControlle.java

``` LoginControlle.java
	/** メッセージソース */
	private final MessageSource messageSource;

 /**
	 * ログイン
	 * @param modelモデル
	 * @param form入力情報
	 * @return 表示画面
	 */
	@PostMapping("/login")
	public String login(Model model, LoginForm form) {
		var userInfo = service.searchUserById(form.getLoginId());
		var isCorrectUserAuth = userInfo.isPresent()
				&& passwordEncoder.matches(form.getPassword(), userInfo.get().getPassword());
		if(isCorrectUserAuth) {
			return "redirect:/menu";
		}else {
			var errorMsg = AppUtil.getMessage(messageSource, ErrorMessageConst.LOGIN_WRONG_INPUT);
			model.addAttribute("errorMsg",errorMsg);
			return "login";
		}
	}
```

まず、お馴染みの`private final MessageSource messageSource;`でログインコントローラー内にMessageSourceのフィールドを作っといてあげます。

これで、MessageSourceインターフェースの持つメソッドをつかうことができます。

それでは、変数`erroroMsg`の定義をみましょう。

`var errorMsg = AppUtil.getMessage(messageSource, ErrorMessageConst.LOGIN_WRONG_INPUT);`

`AppUtil`クラスの`getMessage`メソッドを利用しています。
引数に`messageSource`と`ErrorMessageConst.LOGIN_WRONG_INPUT`を持っています。

説明しわすれていましたが、`ErrorMessageConst.LOGIN_WRONG_INPUT`はもともとは`messages.properties`ファイルのキーである`login.wrongInput`でした。

しかし、引数として`login.wrongInput`を渡すのはハードコーディングにってよくないので、キーだけを管理するクラスを作って、そこから間接的に持ってきています。

つまり、`ErrorMessageConst.LOGIN_WRONG_INPUT`は`login.wrongInput`ってことです。

これでログインに失敗したときは`model`に`"errorMsg",errorMsg`が追加され`messages.properties`内の文言を持ってきてくれます。

最後に、`ErrorMessageConst`クラスも載せときます。

# ErrorMessageConst.java
```ErrorMessageConst.java
package com.example.demo.constant;

/**
 * エラーメッセージID定数クラス
 * @author 81906
 *
 */
public class ErrorMessageConst {
	
	/** ログイン画面：入力誤り */
	public static final String LOGIN_WRONG_INPUT = "login.wrongInput";
}
```

次→