業務系システムではよくある話ですが、OS標準やフレームワーク固有のメッセージをお客様が塗り替え定義できるようにする、という要件があります。
さらに多言語要件と絡んで、辞書マスタのようなものを持たせて、ユーザがそこに画面上の表示文言やメッセージを投入するという仕様が求められます。
そうした要件への対応に向けた1歩として、まず今日はバリデーション等に引っかかったときに出るJSF標準のメッセージを塗り替える方法を調査・お試ししました。
参考にした情報は以下です。
http://jcp.org/aboutJava/communityprocess/final/jsr314/index.html
上記仕様書の2.5.2.4 Localized Application Messagesの章を読んだりしましたが、やはり以下のサイトのような具体例がわかりやすいですね。というか全てが書かれています…。
http://www.mkyong.com/jsf2/customize-validation-error-message-in-jsf-2-0/
あと、一緒だと思っていたのですがResourceBundleとMessageBundleの違いに関しては以下に触れられていました。
http://stackoverflow.com/questions/2668161/when-to-use-message-bundle-and-resource-bundle
では、早速挙動の確認をば↓
1.まずは標準メッセージを確認するために必須入力テキストとボタンを配置
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<h:form id="formId">
<h:inputText id="txtId" required="true" />
<h:commandButton value="submit" />
<h:outputLabel value="#{propResourceBundle.prop()}" />
</h:form>
</h:body>
</html>
2.何も入力せずにボタンを押下するとこんな感じ

3.ロケールを英語にしてみましょう
BackBeanにこんな感じのを追加して起動
FacesContext fCon = FacesContext.getCurrentInstance();
fCon.getViewRoot().setLocale(new Locale("en"));
4.ちゃんと英語で怒られました

5.いったいこのメッセージはどこを参照しているのか?と探してみました。
このキャプチャはNetBeansのメニュー「ファイル」->「新規プロジェクト」->「Java Web」->「Webアプリケーション」で作成したものですが、ライブラリの中にGlassFishがみえて

javax.faces.jarを開いて

javax.facesを展開すると

Messages.propertiesが!

Messages.propertiesファイルを開くと以下のように表示されます。これが参照されてる認識であってるのかな?

ちなみにNetBeansで「Java Web」ではなく「Maven」->「Webアプリケーション」で作るとみえないですね…ふむ。
6.自前のpropertiesファイルを作ります
message.propertiesファイルとして以下のような日本語を
javax.faces.component.UIInput.REQUIRED = {0}は、必須なんです。入力してあげて下さい(゚∀゚*)
message_en.propertiesファイルとして以下のような英語を
javax.faces.component.UIInput.REQUIRED = {0} is required :-)
で、とりあえず以下に配置

7.faces-config.xmlを定義します
<faces-config version="2.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlnsxsi="http://www.w3.org/2001/XMLSchema-instance"
xsischemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">
<application>
<message-bundle>
messages.message
</message-bundle>
</application>
</faces-config>
今までfaces-config.xmlを使うことなかったのですが、こればっかりは仕方がない感じ…。
8.実行!


ちゃんとメッセージ変わったー!