JSFでのメッセージにpropertiesファイルを使う

JSFでメッセージをpropertiesファイルに書く方法を調べてみました。

具体的には、以下を行う方法の調査です。

StrutsのActionMessageと同等の機能ですね。

なおプレースホルダは、{0}とか{1}をメッセージに含めておいて実行時に置換する機能のことです。
本当はBean Validationみたく{max}のように名前で書ければいいんですが、ResourceBundleの域を超えるのでムリな気がします。これは大目に見ます。

調査結果

いろいろ調べて一応出来たのですが、これが信じられないくらいめんどくさい。

まず準備。

  1. propertiesファイルを作成
  2. faces-config.xmlにpropertiesファイルをリソースバンドルとして登録

そしてFacesMessageを得るには

  1. FacesMessage.FACES_MESSAGES、あるいはFacesContext.getCurrentInstance().getApplication().getMessageBundle()で得られる名前のResourceBundleを取得して
  2. java.text.MessageFormatを使ってプレースホルダを解決して
  3. FacesMessageオブジェクトを作る

とやります。

・・・めんどくさい・・・特にResourceBundleの取得が。
プレースホルダも自前で解決する必要があります。

他に良い方法は?

JSFみたいな高度に抽象化されたフレームワークの中で、こんな低レベルな処理が必要になるのは考えにくい。もっと良い方法があるはず!」と思わないでもないのですが、デフォルトで提供されるDateTimeConverterとかのソース見るとこうやってるんですよね・・・
ちょっとこの面倒さは信じられないのですが、皆さんどうやってるんでしょ?

ちなみにJSFには、どーにも不可解な難しさを感じる事がもう1つあります。これは後日のエントリで。