コントロール プロパティのオーバーライド

状況によっては、クライアントのコード内や外部のコンフィグレーション ファイルでコントロール定義のプロパティをオーバーライドするのが望ましい場合があります。一般的には、サービス コントロールのエンドポイントのアドレスやデータベース コントロールのデータ ソースをオーバーライドする場合です。次のようにデータ ソースがコンフィグレーションされたデータベース コントロール定義があるとします。

DatabaseControl.java (コントロール定義コード)

   @JdbcControl.ConnectionDataSource(jndiName = "myDataSource")
   public interface CustomerDB extends JdbcControl

データ ソースが異なる別のコンテキストでデータベース コントロールを再利用する際、アノテーション値を手動で変更してコントロール定義を再コンパイルするのは不便 (または不可能) な場合があります。この場合は、別のソースからデータ ソース値をオーバーライドするのが望ましいといえます。

コントロール定義のアノテーション値をオーバーライドするには、次のいずれかを実行します。

  1. クライアント コードのコントロール宣言の値をコンフィグレーションする (開発者用)。
  2. ControlBean API をプログラムから使用して値を設定する (開発者用)。
  3. デプロイメント プランを使用して値をコンフィグレーションする (管理者用)。

開発者は、コントロール インスタンスのプロパティが実行時までわからない場合、選択肢 (2) を使用します。この場合、通常、まず適切なコントロールのプロパティを判別し、次に ControlBean API を使用してプログラムからこれらのプロパティをリセットします。

選択肢 (3) は、さまざまな環境へのアプリケーションのデプロイメントを管理するサーバ管理者によって使用されます。たとえば、アプリケーションがテスト環境から実際のプロダクション環境に移行される場合に使用されます。デプロイメント プランによって、コントロール定義またはクライアント コードのコントロール宣言など、アプリケーションのあらゆるコントロール コンテキストのアノテーション値をオーバーライドできます。デプロイメント プランでは、アノテーションによってすでに確立されているコンテキストのみをオーバーライドできます。しかし、新しいコンテキストを追加したり、ControlBean を介して設定した値をオーバーライドしたりすることはできません。

これらのオーバーライド メソッドの優先順位に関する階層ルールについては、後述の「優先順位」を参照してください。

以下の図は、開発者と管理者が利用できる異なる選択肢を示しています。

アノテーションのオーバーライドの要件

アノテーションのオーバーライドは、次の要件を満たす場合のみ使用できます。

方法 1: コントロール宣言フィールドを介してコントロールのアノテーション値をオーバーライドする

クライアント コード内のコントロール宣言フィールドにおけるコントロールのデフォルト プロパティをオーバーライドできます。

上述のデータベース コントロールをデフォルトのプロパティで宣言する方法は次のとおりです。

MyWebService.java (クライアント コード)

    @Control
    private DatabaseControl dbControl;

デフォルトの jndiName プロパティをオーバーライドするには、次の宣言を使用します。

    @Control
    @DatabaseControl.ConnectionDataSource(jndiName = "myOtherDataSource")
    private DatabaseControl dbControl;

上記の宣言で、データベース コントロールでは、コントロール定義で使用される値ではなく myOtherDataSource が使用されます。このオーバーライド値は、MyWebService.java 内からのすべてのメソッド呼び出しに適用されます。

方法 2: ControlBean クラスを介してコントロールのアノテーション値をオーバーライドする

ControlBean クラスはコントロールのすべてのメソッドを実装しており、ControlBean クラスを使用して、プログラムからアノテーション ベースのコントロールのプロパティにアクセスすることができます。ControlBean は、生成された JavaBean クラスで、コントロールの構築時に自動的に作成されます。(コントロールの作成者はコントロールのプロパティのオーバーライドを無効できます。詳細については、@PropertySet アノテーションを参照してください)。

生成された ControlBean クラスの名前には、「Bean」という文字列が付いています。コントロール名が CustomerDB.java の場合、生成された ControlBean クラスは CustomerDBBean.class となります。

この方法を使用する場合は注意が必要です。デプロイメント プランではオーバーライドすることはできません (後述の方法 3)。

コントロールのソースから生成された ControlBean の詳細については、「コントロール作成モデル」を参照してください。

ControlBean メソッドを呼び出す

jndiName 属性がデータ ソース myDataSource を指すデータベース コントロールがあるとします。

DatabaseControl.java

    @JdbcControl.ConnectionDataSource(jndiName = "myDataSource")
    public interface CustomerDB extends JdbcControl

urls プロパティの他のすべての競合する値をオーバーライドするには、データベース コントロールの生成された ControlBean クラスをクライアントに追加し、適切なメソッドを呼び出して JNDI をリセットします。ControlBean クラスを使用すると、コントロール定義の値、コントロール宣言フィールドの値セット、デプロイメント プランでの外部のコンフィグレーションなど、すべての競合する値がオーバーライドされます。

ControlBean クラスを参照するには、以下の宣言を使用します。

    @Control
    private controls.CustomerDBBean customerDBBean;	

JNDI 値をオーバーライドするには、setConnectionDataSourceJndiName(String name) メソッドを呼び出します。

    customerDBBean.setConnectionDataSourceJndiName("myOtherDataSource");

コントロール定義クラスのメソッドを呼び出す

状況によっては、適切なセッター メソッドが ControlBean クラスにはなく、コントロール定義クラスにある場合があります。たとえば、サービス コントロールのターゲット URL をオーバーライドするには、サービス コントロール定義のメソッドを呼び出します。次のコントロール定義プロパティは、

@ServiceControl.Location(urls = {"http://some.domain.com/WebServices/HelloWorld"})
...
public interface HelloWorldServiceControl extends ServiceControl

コントロール定義クラスの setEndpointAddress(String url) メソッドによってオーバーライドされます。

方法 3: デプロイメント プランの外部のコンフィグレーション

アノテーション値によっては、デプロイメント プランの一部として外部のコンフィグレーションを介してオーバーライドすることができます。デプロイメント プランの詳細については、WebLogic Server ドキュメントの「プロダクション デプロイメントのためのアプリケーションのコンフィグレーション」を参照してください。

デプロイメント プランのコンフィグレーション ファイルでは、コントロール定義クラスおよび (クライアント コード内の) コントロール宣言フィールドのアノテーション値をオーバーライドできます。また、デプロイメント プランでは、すでにコード内に存在するアノテーションの値のみ変更することができます。デプロイメント プランを介して新しいコンフィグレーション コンテキストを作成することはできません。

コントロールの作成者は、デプロイメント プランの外部のコンフィグレーションを使用してコントロールのプロパティをオーバーライドできます。詳細については、@PropertySet アノテーションを参照してください。

コントロールのデプロイメント プランを作成するには、次の手順に従います。

  1. アノテーションがパッケージ化され、EAR ファイルとしてデプロイされていることを確認します。WebLogic Server Console では、展開形式のアプリケーションのデプロイメント プランはサポートされません。

    アプリケーションを EAR としてパッケージ化するには、[ファイル|エクスポート|EAR ファイル] を選択します。

    WebLogic Server Console を使用してアプリケーション EAR をデプロイするには、WebLogic Server ドキュメントの「エンタープライズ アプリケーションのインストール」を参照してください。
  2. [ロックして編集] ボタンをクリックして [デプロイメント] リンクをクリックし、[デプロイメントの概要] ページに移動してアプリケーション名をクリックします。
  3. [デプロイメント プラン] タブを選択して [リソースの依存関係](サブ) タブを選択します。
  4. [コントロール] ノード内で、コントロールがモジュールの名前または [アプリケーション] の下に配置されます (コントロールがユーティリティ プロジェクトの一部の場合)。コントロールは、クラス名、インスタンス、フィールドによって分類されます。オーバーライドするアノテーションを選択します。[配列値のオーバーライド] テーブルが表示されます。
  5. [オーバーライド値] 列のセルを選択してオーバーライド値を入力し、〔Enter〕を押します。
  6. 新しい値を入力したら、[配列値のオーバーライド] テーブルの [保存] ボタンをクリックします。
  7. 場所を選択してデプロイメント プランを格納し、[完了] をクリックします。
  8. [デプロイメント] リンクをクリックして [デプロイメント] ページに戻ります。

    アプリケーションが起動していない (状態が「準備完了」) 場合は、アプリケーションの横にあるチェック ボックスを選択して [起動] ボタンをクリックします。

    アプリケーションがすでに実行中 (状態が「アクティブ」) の場合は、アプリケーションの横にあるチェック ボックスを選択して [更新] ボタンをクリックします。最初の選択肢 [このアプリケーションを新しいデプロイメント プランの変更とあわせた場所に更新します (このオプションには、デプロイメント プランを指定する必要があります)。] を選択して [完了] ボタンをクリックします。
  9. [変更のアクティブ化] ボタンををクリックします。

優先順位

アノテーション値をオーバーライドする場合、常に、ControlBean の優先順位が最も高くなります。優先順位は次のとおりです。

  1. 第 1 優先順位。ControlBean を介してプログラムから設定される値 (方法 2 を参照)。
  2. 第 2 優先順位。コントロール宣言フィールドでコンフィグレーションされた値のデプロイメント プランによるオーバーライド (方法 3 を参照)。
  3. 第 3 優先順位。フィールド宣言でコンフィグレーションされた値 (方法 1 を参照)。
  4. 第 4 優先順位。コントロール定義で設定された値のデプロイメント プランによるオーバーライド (方法 3 を参照)。
  5. 第 5 優先順位。コントロール定義クラスの値。

ControlBean メソッドをプログラムから呼び出すと、他のすべての値より優先されます。

たとえば、タイマー コントロールをクライアント コードで宣言して、アノテーションで timeoutSeconds 値を設定しているとします。

    @TimerControl.TimerSettings(repeatsEverySeconds=2, timeoutSeconds = 100)
    @Control
    private TimerControl timerControl;

TimerControlBean クラスを呼び出すことによって、このタイムアウト値をプログラムからオーバーライドできます。

最初に、クライアントで TimerControlBean を宣言します。

    @Control
    private com.bea.control.TimerControlBean timerControlBean;

次に、適切なメソッドを呼び出してタイムアウト値をリセットします。

    timerControlBean.setTimerSettingTimeoutSeconds(200);

関連トピック

コントロール作成モデル


さらにヘルプが必要ですか。質問は workshop ニュース グループまでお寄せください。