LoginSignup
44
41

More than 5 years have passed since last update.

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

Posted at

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;
    }
}
44
41
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
44
41