【Spring Boot】メッセージファイルを「UTF-8」で読込できるようにする方法の紹介

「Spring Boot」を使用して、「BeanValidation」のメッセージファイルを「native2ascii」などを使用して変換せずに、指定した文字エンコード(今回は「utf-8」)で読み込みできるようにする方法の紹介です。

スポンサーリンク

はじめに

メッセージファイルを内容にマルチバイトを使用している場合は、「native2ascii」などを使用して「Unicode」などに変換して使用していることはないでしょうか。

この方法では、マルチバイトを含む文字を使用することは可能ですが、メッセージファイルをエディタなどで表示するときには、人には読みづらい形式になります。再変換して読めるようにしていることがほとんどだと思います。

変換するために少しの手間がかかります。また、久しぶりに変換しようとするとやり方をわすれていること多いです(筆者の体験談です)。

メッセージファイルを変換せずに使用する方法は、メッセージファイルを読み込むときに文字コードを指定すれば解決することができます。こちらは、1度設定すればよいので、次からは変換することを悩むことがなくなります。

環境

  • Java:1.8
  • SpringBoot:2.0.3

メッセージファイルの作成

今回は、マルチバイトの出力を確認するため、メッセージファイルをカスタマイズして使用します。

「Spring Boot」で使用するメッセージファイルは、「ValidationMessages.properties」が使用されています。修正したファイルを、「src/resoruces/ValidationMessages.properties」に保存すれば問題ないと思います。

メッセージファイルの一部を、以下に記載するように修正します。また、メッセージをファイルを修正後、保存するときに文字コードは「utf-8」を指定して保存するようにしてください。

javax.validation.constraints.NotBlank.message=必須入力です。

ちなみに「Unicode」に変換したファイルは、以下に記載する内容になります。人には読みづらい内容になっていますね。

javax.validation.constraints.NotBlank.message=\u5fc5\u9808\u5165\u529b\u3067\u3059\u3002

メッセージ表示の確認(文字化け)

まずは、作成したメッセージファイルを使用して、メッセージを表示できることを確認してみます。

表示結果は、以下に記載したようなイメージになります。メッセージが文字化けして表示されていることが確認できます。

文字化け発生画面
メッセージ表示(文字化け)

文字化けが発生する原因

文字化けが発生する原因は、メッセージファイルの読み取りをするときの文字コードとして「Unicode」を使用しているため、メッセージファイルの文字コード(utf-8)と使用している文字コードが異なるため、文字化けが発生する原因になります。

文字化けの解決方法

メッセージファイルを「utf-8」で読み込みをするためには、以下に記載する処理内容をDI対象となる場所に保存します。また、「Spring Boot」のバージョンにより設定方法が異なるため注意してください。

  • 「SpringBoot」の「1.x」では、「WebMvcConfigurerAdapter」を使用します。
  • 「SpringBoot」の「2.x」では、「WebMvcConfigurerAdapter」が非推奨となっているため「WebMvcConfigurer」を使用します。

サンプルプログラムでは「2.x」で記載しています。

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public Validator getValidator() {
        LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
        // メッセージファイルを読込むための設定を記載します
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        // 「setBasename」を使用することで任意のファイル名に変更することも可能です
        messageSource.setBasename("classpath:ValidationMessages");
        // 「setDefaultEncoding」を使用することで任意の文字コードに変更することも可能です
        messageSource.setDefaultEncoding("UTF-8");
        validator.setValidationMessageSource(messageSource);
        return validator;
    }

}

メッセージ表示の確認(文字化け解消)

対応後の表示結果は、以下に記載したようなイメージになります。メッセージが文字化けしてない状態で表示されていることが確認できます。

文字化け解消画面
メッセージ表示(文字化け解消)

まとめ

メッセージファイルを変換せずに、特定の文字コードで使用できる方法を紹介しました。

メッセージファイルを直接エディタなどで確認できるようになるため、メッセージ内容の確認するとき、多少手間を減らせることができるようになると思います。