name.Caution本バージョンの内容は既に古くなっています。最新のガイドラインはこちらからご参照ください。Overview¶メッセージとは、画面・帳票等のアウトプットに対して表示する文言、またはユーザの画面操作の結果、画面に表示する文言を指す。メッセージは、できるだけ細かく定義することを推奨する。Warning以下の場合において、運用中、あるいは運用前の試験の際、エラーの原因を究明できなくなるリスクが生じる。(開発中は、特に困らないかもしれない。)エラーメッセージを、1つのみ定義しているエラーメッセージを、「重要」と「警告」の2つしか定義していないその結果、開発メンバが少ない中で、メッセージの定義変更を行い、開発が進むにつれて、修正コストが増えることになる。そのため、あらかじめメッセージは、細かい粒度で定義しておくことを推奨する。メッセージタイプ¶メッセージは、内容に応じて、以下3種類のメッセージタイプに分けて管理する。メッセージを定義する際は、出力するメッセージが、どのタイプに属するか意識すること。ユーザの操作による処理が正常に実行された後、画面に表示するメッセージ。何らかの問題があるが、処理を続行できる場合のメッセージ。ユーザの入力値が不正な場合に、入力画面に表示するメッセージ。パターン別メッセージタイプの分類¶メッセージの出力パターンを、以下に示す。メッセージパターンとメッセージの表示内容、及びメッセージタイプを、以下に示す。記号パターン表示内容メッセージタイプ例(A)タイトル画面のタイトル-従業員登録画面ラベル画面、帳票の項目名テーブル項目名コメント-ユーザー名パスワード(B)ダイアログ確認メッセージinfo登録してよろしいでしょうか?削除してよろしいでしょうか?(C)結果メッセージ正常終了info登録しました。(D)警告warnパスワードの有効期限切れが間近です。パスワードを変更して下さい。サーバが混み合っています。時間をおいてから再度実行して下さい。(E)単項目チェックエラーerror“ユーザー名”は必須です。“名前”は20桁以内で入力してください。“金額”には数字を入力してください。(F)相関チェックエラーerror“パスワード”と”パスワード(確認用)”が一致しません。(G)業務エラーerrorキャンセル可能期間を過ぎているため、予約を取り消せません。登録可能件数を超えているため、登録できません。(H)システムエラーerrorXXXシステム閉塞中のため、しばらく経ってから再度実行して下さいタイムアウトが発生しました。システムエラーが発生しました。メッセージID体系¶メッセージは、メッセージIDをつけて管理することを推奨する。主な理由は、以下3つの利点を得るためである。メッセージ変更時に、ソースコードを修正することなくメッセージを変更するためメッセージの出力箇所を特定しやすくするため国際化に対応できるためメッセージIDの決め方は、メンテナンス性向上のため、規約を作って統一することを強く推奨する。メッセージパターン毎のメッセージID規約例を以下に示す。開発プロジェクトでメッセージID規約が定まっていない場合は、参考にされたい。画面のタイトルに使用する、メッセージIDの決め方について説明する。InputTip本例は、Tilesを利用する場合に有効である。Tilesを利用しない場合は、次に説明するラベルの規約を利用しても良い。画面のラベル、帳票の固定文言に使用する、メッセージIDの決め方について説明する。conditions.Noteプロジェクトが複数存在する場合に、メッセージIDが重複しないようにプロジェクト区分を定義する。単一プロジェクトの場合でも、将来を見据えてプロジェクト区分を定義することを推奨する。同一メッセージを定義しないように、複数の業務間で共有するメッセージについて説明する。業務で個別に使用するメッセージについて説明する。入力チェックでエラーがある場合に出力するメッセージについては、Validation_message_properties_usingを参照されたい。Note入力チェックエラーの出力場所に関する基本方針を、以下に示す。単項目入力チェックエラーのメッセージは、対象の項目がわかるように項目の横に表示させる。相関入力チェックエラーのメッセージは、ページ上部などにまとめて表示させる。単項目チェックでもメッセージを項目の横に表示させにくい場合は、ページ上部に表示させる。その場合は、メッセージに項目名を含める。プロパティを使用する際の設定¶メッセージ管理を行うorg.springframework.context.MessageSourceの実装クラスの定義を行う。説明(1)MessageSourceの定義。ここではResourceBundleMessageSourceを使用する。(2)使用するメッセージプロパティの基底名を定義する。クラスパス相対で指定する。この例では”src/main/resources/i18n/application-messages.properties”を読み込む。プロパティに設定したメッセージの表示¶application-messages.propertiesここでは、application-messages.propertiesにメッセージを定義する例を示す。ISO-8859-1に変換して使用することが多かった。文字コードUTF-8にすることで、propertiesファイルに直接日本語等を使用できる。application-messages.propertieslabel.aa.bb.year=年label.aa.bb.month=月label.aa.bb.day=日この場合、以下のように、ResourceBundleMessageSourceにも読み込む文字コードを指定する必要がある。defaultEncodingを設定すること。JSP上記で設定したメッセージをJSPからは、<spring:message>タグを用いて表示できる。インクルード用の共通JSPの作成の設定が必要である。/>フォームのラベルと使用する場合は、以下のように使用すれば良い。/></form:form>ブラウザで表示すると以下のように出力される。(日本語メッセージ)というように各言語用のpropertiesファイルを作成すればよい。詳細は、国際化を参照されたい。共通ライブラリでは、org.terasoluna.gfw.common.message.ResultMessages、およびorg.terasoluna.gfw.common.message.ResultMessageを提供している。説明ResultMessages結果メッセージの一覧とメッセージタイプを持つクラス。結果メッセージの一覧はList<ResultMessage>、メッセージタイプはorg.terasoluna.gfw.common.message.ResultMessageTypeインタフェースで表現される。ResultMessage結果メッセージのメッセージID、または、メッセージ本文を持つクラス。この結果メッセージをJSPで表示するためのJSPタグライブラリとして、<t:messagesPanel>タグも提供される。結果メッセージを表示する方法を説明する。ControllerクラスResultMessagesオブジェクトの生成方法、および画面へメッセージを渡す方法を示す。application-messages.proertiesには、各業務で個別に使用するメッセージの例が定義されていることとする。説明(1)メッセージタイプが”error”であるResultMessagesを作成し、メッセージIDが”e.ex.an.9001”である結果メッセージを設定する。この処理は次と同義である。ResultMessages.error().add(ResultMessage.fromCode("e.ex.an.9001"));メッセージIDを指定する場合は、ResultMessageオブジェクトの生成を省略できるため、省略することを推奨する。(2)ResultMessagesをModelに追加する。属性は指定しなくてよい。(属性名は”resultMessages”になる)JSPWEB-INF/views/message/index.jspを、以下のように記述する。タグをデフォルト設定で使用する。デフォルトでは、属性名が”resultMessages”のオブジェクトを表示する。そのため、デフォルトではControllerからModelにResultMessagesを設定する際に、属性名を設定する必要がない。ブラウザで表示すると、以下のように出力される。よって出力されるHTMLを、以下に示す(説明しやすくするために整形している)。説明(1)メッセージタイプに対応して”alert-error”クラスが付与されている。error-[メッセージタイプ]”が付与される。(2)結果メッセージのリストが<ul>タグで出力される。(3)メッセージIDに対応するメッセージがMessageSourceから解決される。<t:messagesPanel>はclassを付けたHTMLを出力するだけであるため、見栄えは出力されたclassに合わせてCSSでカスタマイズする必要がある(後述する)。メッセージ本文はプロパティファイルから取得することを推奨する。メッセージのプレースホルダに値を埋める場合は、次のようにaddメソッドの第二引数以降に設定すればよい。/>タグにより、以下のようなHTMLが出力される。カンマ区切りで1,024と表示される。カンマが不要な場合は、プロパティファイルには以下のように設定する。{0,number,#}MB.詳細は、Javadocを参照されたい。以下のように、複数の結果メッセージを設定することもできる。1024);model.addAttribute(messages);この場合は、次のようなHTMLが出力される(JSPの変更は、不要である)。</ul></div>infoメッセージを表示したい場合は、次のようにResultMessages.info()メソッドでResultMessagesオブジェクトを作成すればよい。"XXXX");model.addAttribute(messages);以下のようなHTMLが、出力される。alert-info“に変わっている。標準では、以下のメッセージタイプが用意されている。alert-dangerメッセージタイプに応じてCSSを定義されたい。以下に、CSSを適用した場合の例を示す。/>で出力した例Notesuccessとdangerは、スタイルに多様性を持たせるために用意されている。本ガイドラインでは、successとinfo、errorとdangerは同義である。/>のデフォルト設定で利用できる。Warning本例では、メッセージキーをハードコードで設定している。保守性を高めるためにも、メッセージキーは、定数クラスにまとめることを推奨する。メッセージキー定数クラスの自動生成ツールを参照されたい。結果メッセージの属性名指定¶ResultMessagesをModelに追加する場合、基本的には属性名を省略できる。ResultMessagesは一つのメッセージタイプしか表現できない。1画面に異なるメッセージタイプのResultMessagesを同時に表示したい場合は、明示的に属性名を指定してModelに設定する必要がある。説明(1)メッセージタイプが”warn”である、ResultMessagesを属性名”messages1”でModelに追加する。(2)メッセージタイプが”info”である、ResultMessagesを属性名”messages2”でModelに追加する。説明(1)属性名が”messages1”であるResultMessagesを表示する。(2)属性名が”messages2”であるResultMessagesを表示する。ブラウザで表示すると、以下のように出力される。業務例外メッセージの表示¶org.terasoluna.gfw.common.exception.BusinessExceptionとorg.terasoluna.gfw.common.exception.ResourceNotFoundExceptionは内部でResultMessagesを保持している。業務例外メッセージを表示する場合は、ServiceクラスでResultMessagesを設定したBusinessExceptionをスローすること。ControllerクラスではBusinessExceptionをキャッチし、例外中の結果メッセージをModelに追加する。説明(1)エラーメッセージをResultMessagesで作成し、BusinessExceptionに設定する。説明(1)BusinessExceptionが保持するResultMessagesを取得し、Modelに追加する。こちらの方法を使用する。独自メッセージタイプを作成する¶メッセージタイプを追加したい場合の、独自メッセージタイプ作成方法について説明する。通常は、用意されているメッセージタイプのみで十分であるが、採用しているCSSライブラリによってはメッセージタイプを追加したい場合がある。”notice”というメッセージタイプを追加する場合を説明する。以下のようにorg.terasoluna.gfw.common.message.ResultMessageTypeインタフェースを実装した独自メッセージタイプクラスを作成する。説明(1)ResultMessageTypeインタフェースを実装したEnumを定義する。定数オブジェクトで作成してもよいが、Enumで作成することを推奨する。(2)getTypeの返り値が出力されるCSSのclass名に対応する。このメッセージタイプを使用して以下のようにResultMessagesを作成する。説明(1)ResultMessagesのコンストラクタに対象のResultMessageTypeを指定する。以下のようなHTMLが出力される。</ul></div>Tip拡張方法は、org.terasoluna.gfw.common.message.StandardResultMessageTypeが参考になる。<t:messagesPanel>タグの属性変更¶<t:messagesPanel>タグには、表示形式を変更する属性がいくつか用意されている。