状況によっては、クライアントのコード内や外部のコンフィグレーション ファイルでコントロール定義のプロパティをオーバーライドするのが望ましい場合があります。一般的には、サービス コントロールのエンドポイントのアドレスやデータベース コントロールのデータ ソースをオーバーライドする場合です。次のようにデータ ソースがコンフィグレーションされたデータベース コントロール定義があるとします。
DatabaseControl.java (コントロール定義コード)
@JdbcControl.ConnectionDataSource(jndiName = "myDataSource") public interface CustomerDB extends JdbcControl
データ ソースが異なる別のコンテキストでデータベース コントロールを再利用する際、アノテーション値を手動で変更してコントロール定義を再コンパイルするのは不便 (または不可能) な場合があります。この場合は、別のソースからデータ ソース値をオーバーライドするのが望ましいといえます。
コントロール定義のアノテーション値をオーバーライドするには、次のいずれかを実行します。
開発者は、コントロール インスタンスのプロパティが実行時までわからない場合、選択肢 (2) を使用します。この場合、通常、まず適切なコントロールのプロパティを判別し、次に ControlBean API を使用してプログラムからこれらのプロパティをリセットします。
選択肢 (3) は、さまざまな環境へのアプリケーションのデプロイメントを管理するサーバ管理者によって使用されます。たとえば、アプリケーションがテスト環境から実際のプロダクション環境に移行される場合に使用されます。デプロイメント プランによって、コントロール定義またはクライアント コードのコントロール宣言など、アプリケーションのあらゆるコントロール コンテキストのアノテーション値をオーバーライドできます。デプロイメント プランでは、アノテーションによってすでに確立されているコンテキストのみをオーバーライドできます。しかし、新しいコンテキストを追加したり、ControlBean を介して設定した値をオーバーライドしたりすることはできません。
これらのオーバーライド メソッドの優先順位に関する階層ルールについては、後述の「優先順位」を参照してください。
以下の図は、開発者と管理者が利用できる異なる選択肢を示しています。
アノテーションのオーバーライドは、次の要件を満たす場合のみ使用できます。
クライアント コード内のコントロール宣言フィールドにおけるコントロールのデフォルト プロパティをオーバーライドできます。
上述のデータベース コントロールをデフォルトのプロパティで宣言する方法は次のとおりです。
MyWebService.java (クライアント コード)
@Control private DatabaseControl dbControl;
デフォルトの jndiName プロパティをオーバーライドするには、次の宣言を使用します。
@Control @DatabaseControl.ConnectionDataSource(jndiName = "myOtherDataSource") private DatabaseControl dbControl;
上記の宣言で、データベース コントロールでは、コントロール定義で使用される値ではなく myOtherDataSource が使用されます。このオーバーライド値は、MyWebService.java 内からのすべてのメソッド呼び出しに適用されます。
ControlBean クラスはコントロールのすべてのメソッドを実装しており、ControlBean クラスを使用して、プログラムからアノテーション ベースのコントロールのプロパティにアクセスすることができます。ControlBean は、生成された JavaBean クラスで、コントロールの構築時に自動的に作成されます。(コントロールの作成者はコントロールのプロパティのオーバーライドを無効できます。詳細については、@PropertySet アノテーションを参照してください)。
生成された ControlBean クラスの名前には、「Bean」という文字列が付いています。コントロール名が CustomerDB.java の場合、生成された ControlBean クラスは CustomerDBBean.class となります。
この方法を使用する場合は注意が必要です。デプロイメント プランではオーバーライドすることはできません (後述の方法 3)。
コントロールのソースから生成された 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) メソッドによってオーバーライドされます。
アノテーション値によっては、デプロイメント プランの一部として外部のコンフィグレーションを介してオーバーライドすることができます。デプロイメント プランの詳細については、WebLogic Server ドキュメントの「プロダクション デプロイメントのためのアプリケーションのコンフィグレーション」を参照してください。
デプロイメント プランのコンフィグレーション ファイルでは、コントロール定義クラスおよび (クライアント コード内の) コントロール宣言フィールドのアノテーション値をオーバーライドできます。また、デプロイメント プランでは、すでにコード内に存在するアノテーションの値のみ変更することができます。デプロイメント プランを介して新しいコンフィグレーション コンテキストを作成することはできません。
コントロールの作成者は、デプロイメント プランの外部のコンフィグレーションを使用してコントロールのプロパティをオーバーライドできます。詳細については、@PropertySet アノテーションを参照してください。
コントロールのデプロイメント プランを作成するには、次の手順に従います。
ControlBean メソッドをプログラムから呼び出すと、他のすべての値より優先されます。
たとえば、タイマー コントロールをクライアント コードで宣言して、アノテーションで timeoutSeconds 値を設定しているとします。
@TimerControl.TimerSettings(repeatsEverySeconds=2, timeoutSeconds = 100) @Control private TimerControl timerControl;
TimerControlBean クラスを呼び出すことによって、このタイムアウト値をプログラムからオーバーライドできます。
最初に、クライアントで TimerControlBean を宣言します。
@Control private com.bea.control.TimerControlBean timerControlBean;
次に、適切なメソッドを呼び出してタイムアウト値をリセットします。
timerControlBean.setTimerSettingTimeoutSeconds(200);