Spring Boot Validation and to customize Error Message

Spring Boot で画面の入力チェックとエラーメッセージの表示を実装
Spring Boot Version 2.0.0.M7で実装してみました。

エラー時の画面サンプル

f:id:tomoTaka:20171222212933p:plain

@ NumberFormatで、フォーマットしてくれて便利
String型以外の項目は、RequestをFormクラスに変換する時にエラーを検知して、BindingResultにエラーが追加
なので、以下のmessages.propertiesで、typeMismatchが先頭についているエラーとなっているよう

public class PersonForm {
    @NotEmpty
    private String firstName;

    @NotEmpty
    private String lastName;

    @Max(100)
    private Integer age;

    @Past
    @DateTimeFormat(pattern = "uuuu-MM-dd")
    private LocalDate birthDay;

    @Digits(integer = 10, fraction = 0)
    @NumberFormat(pattern = "#,###")
    private BigDecimal salary;
... setter and getter
@Controller
@RequestMapping("/person")
public class PersonController {
    private static final Logger logger = LoggerFactory.getLogger(PersonController.class);

    @ModelAttribute
    public PersonForm setUp() {
        PersonForm personForm = new PersonForm();
        // set init value
        personForm.setFirstName("first Name1");
        personForm.setLastName("last name1");
        return personForm;
    }

    @RequestMapping("/")
    public String home() {
        logger.info("home");
        return "/person";
    }

    @PostMapping("/valid")
    public String valid(@Validated PersonForm personForm, BindingResult bindingResult) {
        logger.info("person valid");
        bindingResult.getAllErrors().forEach(e -> logger.error("error=[{}]", e.getDefaultMessage()));

        return "person";
    }
}
  • エラーメッセージは、resources directory配下に、messages.propertiesで以下の内容で作成

以下のキーに例えば「validation」とかの接頭語を付けたいのですが、方法が?です。

# for form column of error message
firstName=名
lastName=姓
age=年齢
birthDay=誕生日
salary=給与
# for validation error message
NotEmpty={0}は、必須です。
Max={0}は、{1}文字までで入力してください。
Max.personForm.age={0}は、{1}歳までで入力してください。
Digits={0}は、整数部{2}文字で入力してください。
Past={0}は、過去の日を入力してください。
typeMismatch.personForm.java.lang.Integer={0}は、数値で入力してくださいね。
typeMismatch.personForm.age={0}は、数値で入力してください。
typeMismatch.java.math.BigDecimal={0}は、金額で入力してください
typeMismatch.java.time.LocalDate={0}は、日付けを入力してください

コードは、アップ
https://github.com/tomoTaka01/spring-mvc-sample
カスタムバリデーションも作成したいです!

修正したコードを再起動なしで反映する

Spring Boot ではbuild.gradleにdevtoolsを追加するだけ

dependencies {
	runtime('org.springframework.boot:spring-boot-devtools')
}

[ctrl]+[command]+a
f:id:tomoTaka:20171222224427p:plain
f:id:tomoTaka:20171222224444p:plain