17.6.2 DDによるアノテーションの上書き
アノテーションに定義した情報は,DDで上書きできます。DDによって上書きできるのは,Servlet 2.5以降およびEJB3.0以降のモジュールに定義されたアノテーションです。
アノテーションを上書きする方法には,次の2種類があります。
- DDを編集して上書きする方法
-
DDを直接編集する方法です。
- サーバ管理コマンドを使用して属性を変更して上書きする方法
-
J2EEサーバにインポート後のアプリケーションに対して,cjsetapppropコマンドまたはcjsetrespropコマンドを使用して属性を変更する方法です。ただし,この方法で上書きできるアノテーションには条件があります。詳細については「17.6.3 サーバ管理コマンドを使用した定義の参照と更新」を参照してください。
- 参考
-
アプリケーションサーバにインポートするEJB 3.0以降のDDには次の定義ができます。
-
<display-name>要素
-
<interceptor-binding>要素,およびその配下の要素(インターセプタに関する定義)
-
<application-exception>要素,およびその配下の要素(アプリケーション例外に関する定義)
-
- 注意事項
-
@WebServletアノテーションのname属性には,別の@WebServletアノテーションと同じ値を設定できません。また,@WebFilterアノテーションのfiltername属性には,別の@WebFilterアノテーションと同じ値を設定できません。別のアノテーションと同じ値を設定した場合,DDでの上書き時に次のメッセージが出力され,該当するアノテーションは無視されます。
アノテーション
属性
メッセージ
@WebServlet
name属性
KDJE42397-W
@WebFilter
filtername属性
KDJE42398-W
上書き方法は,対象となるDDの要素および子要素が複数回出現できる要素かどうかによって異なります。
- DDの要素が0回(出現なし)または1回しか出現しない要素の場合
-
アノテーションの情報はDDの情報で上書きされます。
- DDの要素が0回以上または1回以上出現する要素の場合
ここでは,DDによるアノテーションの上書き規則を次の四つのパターンに分けて説明します。
パターン |
アノテーションと対応するDDの要素の出現回数 |
キーの有無 |
DDの子要素の出現回数 |
参照先 |
---|---|---|---|---|
パターン1 |
0回または1回 |
キーがない場合 |
− |
(1) |
パターン2 |
0回以上または1回以上 |
キーがない場合 |
− |
(2) |
パターン3 |
キーがある場合 |
0回または1回 |
(3) |
|
パターン4 |
0回以上または1回以上 |
(4) |
(凡例)−:キーの有無による違いがない
アノテーションとDDの要素の対応,各要素のキーの有無,およびキーとなる要素については,標準仕様を参照してください。
それぞれのパターンについて説明します。
- 〈この項の構成〉
(1) パターン1(0回または1回出現する要素の場合)
出現回数が0回または1回出現する要素の場合は,アノテーションに対応する要素がDDに定義されているかどうかで上書きするかどうかが決まります。キーの値は関係ありません。
- アノテーションに対応する要素がDDに定義されている場合
-
DDの定義でアノテーションの定義が上書きされます。
- アノテーションに対応する要素がDDに定義されていない場合
-
アノテーションの定義が有効になります。
出現回数が0回または1回の要素の例を次の図に示します。キーがある場合の例です。
(2) パターン2(0回以上または1回以上出現する要素でキーがない場合)
DDとアノテーションの両方の定義が有効になります。
キーがない場合の例を次の図に示します。「@DeclareRoles」で定義したセキュリティロールに加えて,DDで新しいセキュリティロールを定義します。
この例では,アノテーションで「admin」「adminadmin」および「adminadminadmin」の三つのセキュリティロールを定義しています。これに加えて,DDで定義した「admin2」が追加されてマージ後のDDに反映されます。なお,「adminadmin」はアノテーションおよびDDの両方で定義されているセキュリティロールです。アプリケーションは,マージ後のDDが定義されたものとして動作します。
なお,このパターンに該当する場合,アノテーションの定義はサーバ管理コマンドで変更できません。アノテーションに対応する情報を属性ファイルで削除・変更してcjsetapppropコマンドを実行しても,そのあとでcjgetapppropコマンドによって取得した属性ファイルには,アノテーションで定義された情報が出力されます。
(3) パターン3(0回以上または1回以上出現する要素で子要素が0回または1回出現する場合)
DDの要素内の子要素が0回または1回出現する場合は,キーの値によって上書きの方法が異なります。
- キーの値がDDとアノテーションで一致している場合
-
アノテーションの定義にDDの要素を上書きします。
- キーの値がDDとアノテーションで一致しない場合
-
上書きされません。DDとアノテーションの両方の定義が有効になります。
図17‒5 子要素が0回または1回出現する例
この例では,「res1」の環境エントリの値をアノテーションで定義した「TEST」からDDで定義した「RUNNING」に変更します。アプリケーションは,マージ後のDDが定義されたものとして動作します。
(4) パターン4(0回以上または1回以上出現する要素で子要素が0回以上または1回以上出現する場合)
DDの要素内の子要素が0回以上または1回以上出現する場合は,キーの値によって上書きの方法が異なります。
- キーの値がDDとアノテーションで一致している場合
-
アノテーションの定義にDDの要素が追加されます。
- キーの値がDDとアノテーションで一致しない場合
-
上書きされません。DDとアノテーションの両方の定義が有効になります。
図17‒6 子要素が0回以上または1回以上出現する例
この例では,アノテーションの定義に対して,DDで定義した要素「injection-target」が追加されます。アプリケーションは,マージ後のDDが定義されたものとして動作します。