Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

JSFの標準メッセージを塗り替えるお仕事

業務系システムではよくある話ですが、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" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="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.実行!


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

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村