Spring Bootのバリデーションメッセージの変更

#はじめに
spring bootでバリデーションチェックをアノテーションで行った際のメッセージを変更する備忘録です

#環境情報
Spring Boot 1.5.4(Maven)

#ソース
Controller、Form、Viewを作る

```java:LoginController.java
@Controller
@RequestMapping({"/", "/login"})
public class LoginController extends BaseController {

	@ModelAttribute
	public LoginForm initForm(){
		return new LoginForm();
	}

	@RequestMapping(value = {"/index", "/"}, method = RequestMethod.GET)
	public String index(Model model){
		return "test/index";
	}

	@RequestMapping(value = "/login", method = RequestMethod.POST)
	public String login(@ModelAttribute @Validated TestForm form, BindingResult result, Model model)
	{
		if(result.hasErrors()){
			return "test/index";
		}

		//ログイン処理
		......

		return "redirect:/menu/index";
	}
}
```

```java:LoginForm.java
public class LoginForm extends BaseForm {

	@NotEmpty
	public String userId;
	@NotEmpty
	public String password;

	/* thymeleafで使用する為にgetter/setterが必要 */
	public String getUserId() {
		return userId;
	}
	public void setUserId(String userId) {
		this.userId = userId;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}

}
```

```html:login/index.html
<!DOCTYPE html>
<html
	xmlns        = "http://www.w3.org/1999/xhtml"
	xmlns:th     = "http://www.thymeleaf.org"
	xmlns:layout = "http://www.ultraq.net.nz/thymeleaf/layout"
	layout:decorator="layout"
>
<head>
	<title>ログイン</title>
</head>
<body>
	<div layout:fragment="contents">
		<form class="form-horizontal" method="POST" action="/login/login/" th:action="@{/login/login}" th:object="${loginForm}">
			<div class="form-group">
				<p th:if="${#fields.hasErrors('*{userId}')}" th:errors="*{userId}" class="col-sm-offset-2 text-danger"></p>
				<label for="user-id" class="col-sm-2 control-label">ユーザーID</label>
				<div class="col-sm-5">
					<input type="text" class="form-control" id="user-id" th:field="*{userId}" placeholder="ユーザーID" />
				</div>
			</div>
			<div class="form-group">
				<p th:if="${#fields.hasErrors('*{password}')}" th:errors="*{password}" class="col-sm-offset-2 text-danger"></p>
				<label for="password" class="col-sm-2 control-label">パスワード</label>
				<div class="col-sm-5">
					<input type="password" class="form-control" id="password" th:field="*{password}" placeholder="パスワード" />
				</div>
			</div>
			<div class="form-group">
				<input type="submit" class="btn btn-primary col-sm-2 col-sm-offset-2" name="login" value="ログイン" />
				<input type="reset" class="btn btn-default col-sm-2 col-sm-offset-1" name="clear" value="クリア" />
			</div>
		</form>
	</div>
</body>
</html>
```

次に`WebMvcConfigurerAdapter`を継承したクラスを作成する
メッセージがデフォルトではUTF-8に対応していないらしいので、
エンコードをUTF-8に設定する

```java:AppConfigurerAdapter.java
@Configuration
public class AppConfigurerAdapter extends WebMvcConfigurerAdapter {

	@Bean(name="validator")
	public LocalValidatorFactoryBean localValidatorFactoryBean() {
		LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
		localValidatorFactoryBean.setValidationMessageSource(messageSource());
		return localValidatorFactoryBean;
	}

	/**
	 * ValidationのメッセージをUTF-8で管理します。
	 * @return
	 */
	@Bean(name = "messageSource")
	public MessageSource messageSource()
	{
		ReloadableResourceBundleMessageSource bean = new ReloadableResourceBundleMessageSource();
		bean.setBasename("classpath:ValidationMessages");
		bean.setDefaultEncoding("UTF-8");
		return bean;
	}

}
```

次にバリデーションメッセージを記載するpropertiesファイルを`resource`フォルダ直下に作成する
ファイル名は`AppConfigurerAdapter.java`で指定したファイル名にすること
メッセージのKeyはアノテーションのフルネームを指定する。
メッセージの`{0}`にはフィールド名が入る
フィールド名に別名を付けたい場合はフィールド名も設定する

```properties:ValidationMessages.properties
#メッセージ
org.hibernate.validator.constraints.NotEmpty.message={0}を入力してください。

#フィールド名
userId=ユーザーID
password=パスワード
```

#実行してみる
ログイン画面でユーザーIDとパスワードを未入力でログインボタンを押下した結果です。
<img width="494" alt="login.png" src="https://qiita-image-store.s3.amazonaws.com/0/189711/095874f1-9e3c-d82f-855f-31b054aaa30f.png">