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

  • 14
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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