Spring BootではBean Validationをサポートしていて、その実装にHibernate Validatorを採用している。その場合、バリデーションエラー時のエラーメッセージは「ValidationMessages.properties」というメッセージリソースファイルで管理される。このメッセージリソースをSpringのメッセージリソース(MessageSource)に変更してみる。
以下のようにWebMvcConfigurerAdapterを親に持つ@SpringBootApplicationなクラスを作って、getValidatorメソッドをオーバーライドして、validatorメソッドを作ってsetValidationMessageSourceにMessageSourceを指定して上書きしてあげる。
Main.java
@SpringBootApplication
public class Main extends WebMvcConfigurerAdapter {
@Autowired
private MessageSource messageSource;
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
/**
* LocalValidatorFactoryBeanのsetValidationMessageSourceで
* バリデーションメッセージをValidationMessages.propertiesからSpringの
* MessageSource(messages.properties)に上書きする
*
* @return localValidatorFactoryBean
*/
@Bean
public LocalValidatorFactoryBean validator() {
LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
localValidatorFactoryBean.setValidationMessageSource(messageSource);
return localValidatorFactoryBean;
}
@Override
public org.springframework.validation.Validator getValidator() {
return validator();
}
あとは、src/main/resources配下に、以下のような感じでmessages.propertiesを定義してあげる。
messages.properties
Customer.zipCode.invalid=zipCodeは半角数字7桁に設定してください。
Customer.sex.invalid=sexは0または1を設定してください。
beanはこんな感じ。バリデーションエラー時のメッセージに、
message = "{messages.propertiesで定義したキー}"
と指定してやるだけ。
Customer.java
@Entity
@Table(name = "Customer")
public class Customer {
/*
* JPAの仕様上、引数なしのデフォルトコンストラクタが必要
*/
public Customer() {
}
@Column
@NotNull
@Pattern(regexp = "\\d{7}", message = "{Customer.zipCode.invalid}")
private String zipCode;
@Column
@NotNull
@Pattern(regexp = "[0-1]", message = "{Customer.sex.invalid}")
private String sex;
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}