2018年5月10日木曜日

AWS Windowsサーバで Spring Boot の MessageResource の {0} が展開されない場合の解決方法


オフィス狛 技術部 CTOの Taka-yamです。

先日、Spring BootのプログラムをAWSのWindowsサーバにデプロイした際に「あれ?」と思ったことがあったので記載します。

利用したEC2: Microsoft Windows Server 2012 Base - ami-1380926f

Spring Bootではエラーメッセージなどを表示するのみ properties ファイルを利用し、
下記のようにプレースフォルダーを利用しています。

ErrorsCommonInvalid =入力した内容にエラーがあります。
ErrorsCommonRequired ={0}は必ず入力してください。

AWSの無料利用枠を利用していた関係上、Windowsサーバが英語版になっているため、言語や時刻の設定を変更しました。
設定方法はたくさんの良い記事があるので参考リンクを載せて割愛します。
http://blog.serverworks.co.jp/tech/2016/06/20/windows-server-2012-r2-japanese-localization/

設定も完了し、実際に動かしてみても特に問題ないかなと思ったところ、

入力した内容にエラーがあります。// 〇
{0}は必ず入力してください。 // あれ?

という結果に。

元々はオンプレミスのWindowsサーバで動かしており、そっちの環境設定と比べてみても違う箇所が見当たらずしばらく悩むことに、、、

悩んだ結果とうとう見つけたのがこちらでした。

@Bean
ReloadableResourceBundleMessageSource messageSource() {

    Locale.setDefault(Locale.JAPAN); // ←これ!!!!!!!

    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasenames("classpath:messages/messages");
    messageSource.setCacheSeconds(0);
    messageSource.setDefaultEncoding("UTF-8");
    return messageSource;
}

Springでメッセージリソースを読み込む際にリソースが変更されたらメッセージも変更される様にしたいので ReloadableResourceBundleMessageSource を使っていたのですが、 ここのロケールが ja_JP になっていないようです。

システムのロケールを変更しても、サーバのデフォルトのロケール設定は変わらなかったのか?
ちょっと根本的な原因はわかっていませんが、解決策としてはロケールはきちんと指定するということでした。

こういう暗黙の設定による罠、気が付かない内に潜り込んでいることがあるので怖いですね。

, ,

0 件のコメント:

コメントを投稿