メッセージ管理
================================================================================
.. only:: html
.. contents:: 目次
:depth: 4
:local:
Overview
--------------------------------------------------------------------------------
| メッセージとは、画面や帳票等に表示する固定文言またはユーザの画面操作の結果に応じて表示する動的文言を指す。
| また、エラーメッセージは、できるだけ細かく定義することを推奨する。
\
.. warning::
以下の場合において、運用中、あるいは運用前の試験の際、エラーの原因を究明できなくなるリスクが生じる。(開発中は、特に困らないかもしれない。)
* エラーメッセージを、1つのみ定義している
* エラーメッセージを、「重要」と「警告」の2つしか定義していない
その結果、開発メンバが少ない中でメッセージの定義変更を行い、開発が進むにつれて修正コストが増えることになる。
そのため、あらかじめメッセージは、細かい粒度で定義しておくことを推奨する。
本節では、プロパティファイルに設定する際の命名規則やプロパティに設定したメッセージの表示方法、ユーザの画面操作に応じたメッセージの出力方法について説明する。
|
メッセージタイプ
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| ユーザの画面操作の結果に応じて表示するメッセージは、内容に応じて、以下3種類のメッセージタイプに分けて管理する。
| メッセージを定義する際は、出力するメッセージが、どのタイプに属するか意識すること。
.. _message-level-table-label:
.. tabularcolumns:: |p{0.20\linewidth}|p{0.20\linewidth}|p{0.60\linewidth}|
.. list-table::
:header-rows: 1
:widths: 20 20 60
* - メッセージタイプ
- カテゴリ
- 概要
* - info
- 情報メッセージ
- ユーザの操作による処理が正常に実行された後、画面に表示するメッセージ。
* - warn
- 警告メッセージ
- 処理は継続できるが、注意喚起が必要な状態である場合に表示するメッセージ。(例:パスワード有効期限切れが近い場合の通知メッセージ)
* - error
- 入力エラーメッセージ
- ユーザの入力値が不正な場合に、入力画面に表示するメッセージ。
* -
- 業務エラーメッセージ
- 業務ロジックでエラーと判定された場合に表示するメッセージ
* -
- システムエラーメッセージ
- システム起因のエラー(データベースとの接続失敗等)が発生し、ユーザの操作でリカバリできない場合に表示するメッセージ
|
パターン別メッセージタイプの分類
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
メッセージの出力パターンを、以下に示す。
.. figure:: ./images/message-pattern.png
:alt: message pattern
:width: 95%
メッセージパターンとメッセージの表示内容、及びメッセージタイプを、以下に示す。
.. tabularcolumns:: |p{0.05\linewidth}|p{0.15\linewidth}|p{0.20\linewidth}|p{0.10\linewidth}|p{0.50\linewidth}|
.. list-table::
:header-rows: 1
:widths: 5 15 20 10 50
:class: longtable
* - 記号
- パターン
- 表示内容
- メッセージタイプ
- 例
* - | (A)
- | タイトル
- | 画面のタイトル
- | -
- * 従業員登録画面
* - |
- | ラベル
- | 画面の項目名
| 帳票の項目名
| コメント
| ガイダンス
- | -
- * ユーザー名
* パスワード
* - | (B)
- | ダイアログ
- | 確認メッセージ
- | info
- * 登録してよろしいでしょうか?
* 削除してよろしいでしょうか?
* - | (C)
- | 結果メッセージ
- | 正常終了
- | info
- * 登録しました。
* 削除しました。
* - | (D)
- |
- | 警告
- | warn
- * パスワードの有効期限切れが間近です。パスワードを変更して下さい。
* サーバが混み合っています。時間をおいてから再度実行して下さい。
* - | (E)
- |
- | 単項目チェックエラー
- | error
- * "ユーザー名"は必須です。
* "名前"は20桁以内で入力してください。
* "金額"には数字を入力してください。
* - | (F)
- |
- | 相関チェックエラー
- | error
- * "パスワード"と"パスワード(確認用)"が一致しません。
* - | (G)
- |
- | 業務エラー
- | error
- * キャンセル可能期間を過ぎているため、予約を取り消せません。
* 登録可能件数を超えているため、登録できません。
* - | (H)
- |
- | システムエラー
- | error
- * XXXシステム閉塞中のため、しばらく経ってから再度実行して下さい
* タイムアウトが発生しました。
* システムエラーが発生しました。
.. raw:: latex
\newpage
メッセージID体系
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| メッセージは、メッセージIDをつけて管理することを推奨する。
| 主な理由は、以下3つの利点を得るためである。
* メッセージ変更時に、ソースコードを修正することなくメッセージを変更するため
* メッセージの出力箇所を特定しやすくするため
* 国際化に対応できるため
メッセージIDの決め方は、メンテナンス性向上のため、規約を作って統一することを強く推奨する。
| メッセージパターン毎のメッセージID規約例を以下に示す。
| 開発プロジェクトでメッセージID規約が定まっていない場合は、参考にされたい。
タイトル
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
| 画面のタイトルに使用する、メッセージIDの決め方について説明する。
* フォーマット
.. tabularcolumns:: |p{0.20\linewidth}|p{0.20\linewidth}|p{0.20\linewidth}|p{0.20\linewidth}|p{0.20\linewidth}|
.. list-table::
:header-rows: 1
:widths: 20 20 20 20 20
* - 接頭句
- 区切り
- 業務名
- 区切り
- 画面名
* - | title
- | .
- | nnn*
- | .
- | nnn*
* 記述内容
.. tabularcolumns:: |p{0.10\linewidth}|p{0.10\linewidth}|p{0.25\linewidth}|p{0.35\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 10 25 35
* - 項目
- 位置
- 内容
- 備考
* - | 接頭句
- | 1-5桁目 (5桁)
- | "title" (固定)
- |
* - | 業務名
- | 可変長:任意
- | spring-mvc.xmlで定義したviewResolverのprefixの下のディレクトリ(HTMLの上位ディレクトリ)
- |
* - | 画面名
- | 可変長:任意
- | HTML名
- | ファイル名が"aaa.html"の場合"aaa"の部分
* 定義例
.. code-block:: properties
# "/WEB-INF/views/admin/top.html"の場合
title.admin.top=Admin Top
# "/WEB-INF/views/staff/createForm.html"の場合
title.staff.createForm=Staff Register Input
.. tip::
本例は、テンプレートレイアウトを利用する場合に有効である。詳細は\ :doc:`./TemplateLayout`\ を参照されたい。
テンプレートレイアウトを利用しない場合は、次に説明する\ :ref:`message-management_label-rule`\ の規約を利用しても良い。
|
.. _message-management_label-rule:
ラベル
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
画面のラベル、帳票の固定文言に使用する、メッセージIDの決め方について説明する。
* フォーマット
.. tabularcolumns:: |p{0.13\linewidth}|p{0.13\linewidth}|p{0.16\linewidth}|p{0.13\linewidth}|p{0.13\linewidth}|p{0.13\linewidth}|p{0.13\linewidth}|
.. list-table::
:header-rows: 1
:widths: 14 14 16 14 14 14 14
* - 接頭句
- 区切り
- プロジェクト区分
- 区切り
- 業務名
- 区切り
- 項目名
* - | label
- | .
- | xx
- | .
- | nnn*
- | .
- | nnn*
* 記述内容
.. tabularcolumns:: |p{0.10\linewidth}|p{0.10\linewidth}|p{0.25\linewidth}|p{0.35\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 10 25 35
* - 項目
- 位置
- 内容
- 備考
* - | 接頭句
- | 1-5桁目 (5桁)
- | "label" (固定)
- |
* - | プロジェクト区分
- | 7-8桁名 (2桁)
- | プロジェクト名のアルファベット2桁表記
- |
* - | 業務名
- | 可変長:任意
- |
- |
* - | 項目名
- | 可変長:任意
- | ラベル名、説明文名
- |
.. note::
入力チェックエラーのメッセージに項目名(論理名)を含める場合は、
* フォームのモデル名 + "." + フィールド名
.. code-block:: properties
staffForm.staffName = Staff name
* フィールド名
.. code-block:: properties
staffName = Staff name
にする必要がある。
* 使用例
.. code-block:: properties
# スタッフ登録画面のフォームの項目名
# プロジェクト区分=em (Event Management System)
label.em.staff.staffName=Staff name
# ツアー検索画面に表示する説明文の場合
# プロジェクト区分=tr (Tour Reservation System)
label.tr.tourSearch.tourSearchMessage=You can search tours with the specified conditions.
.. note::
プロジェクトが複数存在する場合に、メッセージIDが重複しないようにプロジェクト区分を定義する。
単一プロジェクトの場合でも、将来を見据えてプロジェクト区分を定義することを推奨する。
.. _message-management_result-rule:
結果メッセージ
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
業務間で共通して使用するメッセージ
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
同一メッセージを定義しないように、複数の業務間で共有するメッセージについて説明する。
* フォーマット
.. tabularcolumns:: |p{0.12\linewidth}|p{0.10\linewidth}|p{0.12\linewidth}|p{0.10\linewidth}|p{0.12\linewidth}|p{0.12\linewidth}|p{0.12\linewidth}|p{0.12\linewidth}|
.. list-table::
:header-rows: 1
:widths: 12 12 14 12 14 12 12 12
* - メッセージタイプ
- 区切り
- プロジェクト区分
- 区切り
- 共通メッセージ区分
- 区切り
- エラーレベル
- 連番
* - | x
- | .
- | xx
- | .
- | fw
- | .
- | 9
- | 999
* 記述内容
.. tabularcolumns:: |p{0.20\linewidth}|p{0.20\linewidth}|p{0.40\linewidth}|p{0.10\linewidth}|
.. list-table::
:header-rows: 1
:widths: 20 20 40 10
* - 項目
- 位置
- 内容
- 備考
* - | メッセージタイプ
- | 1桁目 (1桁)
- | info : i
| warn : w
| error : e
- |
* - | プロジェクト区分
- | 3-4桁目 (2桁)
- | プロジェクト名のアルファベット2桁表記
- |
* - | 共通メッセージ区分
- | 6-7桁目 (2桁)
- | "fw" (固定)
- |
* - | エラーレベル
- | 9桁 (1桁)
- | 0-1 : 正常メッセージ
| 2-4 : 業務エラー(準正常)
| 5-7 : 入力チェックエラー
| 8 : 業務エラー(エラー)
| 9 : システムエラー
- |
* - | 連番
- | 10-12桁目 (3桁)
- | 連番で利用する(000-999)
- | メッセージ削除となっても連番は空き番として、削除しない
* 使用例
.. code-block:: properties
# 登録が成功した場合(正常メッセージ)
i.xx.fw.0001=Registered successfully.
# サーバリソース不足
w.xx.fw.9002=Server busy. Please, try again.
# システムエラー発生の場合(システムエラー)
e.xx.fw.9001=A system error has occurred.
.. _message-properties-example:
各業務で個別に使用するメッセージ
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
業務で個別に使用するメッセージについて説明する。
* フォーマット
.. tabularcolumns:: |p{0.12\linewidth}|p{0.10\linewidth}|p{0.12\linewidth}|p{0.10\linewidth}|p{0.12\linewidth}|p{0.12\linewidth}|p{0.12\linewidth}|p{0.12\linewidth}|
.. list-table::
:header-rows: 1
:widths: 12 12 14 12 14 12 12 12
* - メッセージタイプ
- 区切り
- プロジェクト区分
- 区切り
- 業務メッセージ区分
- 区切り
- エラーレベル
- 連番
* - | x
- | .
- | xx
- | .
- | xx
- | .
- | 9
- | 999
* 記述内容
.. tabularcolumns:: |p{0.20\linewidth}|p{0.20\linewidth}|p{0.40\linewidth}|p{0.10\linewidth}|
.. list-table::
:header-rows: 1
:widths: 20 20 40 10
* - 項目
- 位置
- 内容
- 備考
* - | メッセージタイプ
- | 1桁目 (1桁)
- | info : i
| warn : w
| error : e
- |
* - | プロジェクト区分
- | 3-4桁目 (2桁)
- | プロジェクト名のアルファベット2桁表記
- |
* - | 業務メッセージ区分
- | 6-7桁目 (2桁)
- | 業務IDなど業務毎に決める2桁の文字
- |
* - | エラーレベル
- | 9桁 (1桁)
- | 0-1 : 正常メッセージ
| 2-4 : 業務エラー(準正常)
| 5-7 : 入力チェックエラー
| 8 : 業務エラー(エラー)
| 9 : システムエラー
- |
* - | 連番
- | 10-12桁目 (3桁)
- | 連番で利用する(000-999)
- | メッセージ削除となっても連番は空き番として、削除しない
* 使用例
.. code-block:: properties
# ファイルのアップロードが成功した場合
i.xx.yy.0001={0} upload completed.
# パスワードの推奨変更期間が過ぎている場合
w.xx.yy.2001=The recommended change interval of password has passed. Please change your password.
# ファイルサイズが制限を超えている場合
e.xx.yy.8001=Cannot upload, Because the file size must be less than {0}MB.
# データに不整合がある場合
e.xx.yy.9001=There are inconsistencies in the data.
|
入力チェックエラーメッセージ
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
入力チェックでエラーがある場合に出力するメッセージについては、\ :ref:`Validation_message_def`\ を参照されたい。
.. note::
入力チェックエラーの出力場所に関する基本方針を、以下に示す。
* | 単項目入力チェックエラーのメッセージは、対象の項目がわかるように項目の横に表示させる。
* | 相関入力チェックエラーのメッセージは、ページ上部などにまとめて表示させる。
* | 単項目チェックでもメッセージを項目の横に表示させにくい場合は、ページ上部に表示させる。
| その場合は、メッセージに項目名を含める。
|
How to use
--------------------------------------------------------------------------------
プロパティファイルに設定したメッセージの表示
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. _MessageManagementPropertiesExample:
プロパティを使用する際の設定
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
メッセージ管理を行う\ ``org.springframework.context.MessageSource``\ の実装クラスの定義を行う。
* applicationContext.xml
.. code-block:: xml