11.6.2 DDによるアノテーションの上書き

アノテーションに定義した情報は,DDで上書きできます。DDによって上書きできるのは,Servlet 2.5およびEJB3.0のモジュールに定義されたアノテーションです。

Servlet 2.5のモジュールを上書きする方法には,次の2種類があります。

DDを編集して上書きする方法
DDを直接編集する方法です。
サーバ管理コマンドを使用して属性を変更して上書きする方法
J2EEサーバにインポート後のアプリケーションに対して,cjsetapppropコマンドまたはcjsetrespropコマンドを使用して属性を変更する方法です。ただし,この方法で上書きできるアノテーションには条件があります。詳細については「11.6.3 サーバ管理コマンドを使用した定義の参照と更新」を参照してください。
注意
次に示すモジュールに定義されたアノテーションの情報は,DDに定義しても上書きはされません。
  • EJB 2.1,Servlet 2.4
    これらのモジュールに定義できるのは,アプリケーションサーバ独自のアノテーションです。DDによって上書きすることはできません。
  • EJB 3.0
    アプリケーションサーバにインポートするEJB 3.0のDDにはインターセプタだけが定義できます。この定義をDDで上書きすることはできません。

上書き方法は,対象となるDDの要素および子要素が複数回出現できる要素かどうかによって異なります。

DDの要素が0回(出現なし)または1回しか出現しない要素の場合
アノテーションの情報はDDの情報で上書きされます。
DDの要素が0回以上または1回以上出現する要素の場合
DDとアノテーションを関連づける要素(キー)の有無,およびDDの要素内の子要素の出現回数で上書き規則が異なります。

ここでは,DDによるアノテーションの上書き規則を次の四つのパターンに分けて説明します。

表11-17 DDによるアノテーションの上書き規則のパターン

パターンアノテーションと対応するDDの要素の出現回数キーの有無DDの子要素の出現回数参照先
パターン10回または1回キーがない場合(1)
パターン20回以上または1回以上キーがない場合(2)
パターン3キーがある場合0回または1回(3)
パターン40回以上または1回以上(4)

(凡例)-:キーの有無による違いがない

アノテーションとDDの要素の対応,各要素のキーの有無,およびキーとなる要素については,標準仕様を参照してください。

それぞれのパターンについて説明します。

<この項の構成>
(1) パターン1(0回または1回出現する要素の場合)
(2) パターン2(0回以上または1回以上出現する要素でキーがない場合)
(3) パターン3(0回以上または1回以上出現する要素で子要素が0回または1回出現する場合)
(4) パターン4(0回以上または1回以上出現する要素で子要素が0回以上または1回以上出現する場合)

(1) パターン1(0回または1回出現する要素の場合)

出現回数が0回または1回出現する要素の場合は,アノテーションに対応する要素がDDに定義されているかどうかで上書きするかどうかが決まります。キーの値は関係ありません。

アノテーションに対応する要素がDDに定義されている場合
DDの定義でアノテーションの定義が上書きされます。
アノテーションに対応する要素がDDに定義されていない場合
アノテーションの定義が有効になります。

出現回数が0回または1回の要素の例を次の図に示します。キーがある場合の例です。

図11-3 0回または1回出現する要素の例

[図データ]

(2) パターン2(0回以上または1回以上出現する要素でキーがない場合)

DDとアノテーションの両方の定義が有効になります。

キーがない場合の例を次の図に示します。「@DeclareRoles」で定義したセキュリティロールに加えて,DDで新しいセキュリティロールを定義します。

図11-4 キーがない場合の例

[図データ]

この例では,アノテーションで「admin」「adminadmin」および「adminadminadmin」の三つのセキュリティロールを定義しています。これに加えて,DDで定義した「admin2」が追加されてマージ後のDDに反映されます。なお,「adminadmin」はアノテーションおよびDDの両方で定義されているセキュリティロールです。アプリケーションは,マージ後のDDが定義されたものとして動作します。

なお,このパターンに該当する場合,アノテーションの定義はサーバ管理コマンドで変更できません。アノテーションに対応する情報を属性ファイルで削除・変更してcjsetapppropコマンドを実行しても,そのあとでcjgetapppropコマンドによって取得した属性ファイルには,アノテーションで定義された情報が出力されます。

(3) パターン3(0回以上または1回以上出現する要素で子要素が0回または1回出現する場合)

DDの要素内の子要素が0回または1回出現する場合は,キーの値によって上書きの方法が異なります。

キーの値がDDとアノテーションで一致している場合
アノテーションの定義にDDの要素を上書きします。
キーの値がDDとアノテーションで一致しない場合
上書きされません。DDとアノテーションの両方の定義が有効になります。

図11-5 子要素が0回または1回出現する例

[図データ]

この例では,「res1」の環境エントリの値をアノテーションで定義した「TEST」からDDで定義した「RUNNING」に変更します。アプリケーションは,マージ後のDDが定義されたものとして動作します。

(4) パターン4(0回以上または1回以上出現する要素で子要素が0回以上または1回以上出現する場合)

DDの要素内の子要素が0回以上または1回以上出現する場合は,キーの値によって上書きの方法が異なります。

キーの値がDDとアノテーションで一致している場合
アノテーションの定義にDDの要素が追加されます。
キーの値がDDとアノテーションで一致しない場合
上書きされません。DDとアノテーションの両方の定義が有効になります。

図11-6 子要素が0回以上または1回以上出現する例

[図データ]

この例では,アノテーションの定義に対して,DDで定義した要素「injection-target」が追加されます。アプリケーションは,マージ後のDDが定義されたものとして動作します。