Spring Bootでバリデーションエラー時のメッセージリソースをValidationMessages.propertiesからmessages.propertiesにする

More than 1 year has passed since last update.

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;
}
}