7 Webコンポーネント用のWebLogicアノテーション
この章の内容は以下のとおりです。
サーブレット・アノテーションと依存関係インジェクション
サーブレット4.0仕様では、アノテーションを提供することにより宣言形式のプログラミングを可能にします。
https://jcp.org/en/jsr/detail?id=369
を参照してください。
ノート:
WebLogic Server 12.1.3以降は、サーブレット4.0仕様で定義されている標準アノテーションが推奨され、WebLogic Server固有のアノテーション(@WLServlet、@WLFilterおよび@WLInitParam)は非推奨となり、将来のリリースで削除されます。また、weblogic.servlet.http.AbstractAsyncServlet
のかわりに、サーブレット4.0仕様で定義されている標準非同期処理モデルを使用してください。
このサーブレット仕様では、サーブレット、フィルタ、リスナー、タグ・ハンドラなどの特定のWebコンポーネントでアノテーションを定義できると規定されています。アノテーションを使用すると、外部リソースに対する依存関係を宣言できます。コンテナはこれらのコンポーネントのアノテーションを検出し、コンポーネントのライフサイクル・メソッドが呼び出される前に必要な依存関係を注入します。依存関係インジェクション(DI)は特定のコンポーネントに対してのみ行われます。「アノテーションをサポートするWebコンポーネント・クラス」を参照してください。
アノテーション処理とDIは、バージョンが2.5以上に設定されているすべてのWebアプリケーションで実行されます。ただし、アノテーション処理は負荷が大きく、含まれるクラスのサイズによってはWebアプリケーションのデプロイメント時間が長くなる場合があります。Webアプリケーションにアノテーションがなく、また
バージョンが2.5以上に設定されている場合は、web.xml
記述子でmetadata-complete
属性をtrueに設定することで、Webアプリケーション・クラスの不要なアノテーション・スキャンを回避できます。または、WebLogic Serverの起動時に-Dweblogic.servlet.DIDisabled=true
フラグを設定して、すべてのWebアプリケーションに対してアノテーション処理とDIを無効にすることもできます。
WebLogic ServerアプリケーションでのJava EEアノテーションと依存関係インジェクションの使用方法の詳細は、『Oracle WebLogic Serverアプリケーションの開発』のJava EEアノテーションと依存関係インジェクションの使用に関する項およびJava EEプラットフォームでのコンテキストと依存関係インジェクションの使用に関する項 を参照してください。WebLogic Server Enterprise JavaBeansに対するEJB固有のアノテーションの詳細は、『Oracle WebLogic Server Enterprise JavaBeansの開発』を参照してください。
サーバー・サンプルをインストールするように選択した場合、このサーブレット3.xアノテーション・コード・サンプル(「サーブレット、フィルタおよびリスナーに対するアノテーションの使用」)が、WebLogic Server配布キットのORACLE_HOME
\wlserver\samples\server\examples\examples\src\examples\javaee7\servlet\annotation
ディレクトリ内に提供されます。ORACLE_HOME
は、WebLogic Serverをインストールしたディレクトリを表します。WebLogic Serverサンプル・コードの詳細は、『Oracle WebLogic Serverの理解』のサンプル・アプリケーションおよびサンプル・コードに関する項を参照してください。
アノテーションをサポートするWebコンポーネント・クラス
この項では、Java EEに準拠したWebコンテナにおける、リソースに対するアノテーションおよび依存関係インジェクション(DI)の動作について説明します。
Webコンテナでは、表7-1に示されているクラスの型に対してのみアノテーションが処理されます。
表7-1 アノテーションおよび依存関係インジェクションをサポートするWebコンポーネントとインタフェース
コンポーネント・タイプ | インタフェース |
---|---|
サーブレット |
javax.servlet.Servlet |
フィルタ |
javax.servlet.Filter |
リスナー |
|
タグ・ハンドラ |
|
Webコンテナは、Java Beanのようなクラスおよびその他のヘルパー・クラスに対しては、アノテーションを処理しません。Webコンテナでは、DIを実現するために次のステップが行われます。
-
アノテーション処理 - アノテーションは、Webアプリケーションのデプロイメント・フェーズ中にWebコンテナによって処理されます。アノテーションの処理中、コンテナはアノテーションによって影響を受ける記述子内の関連エントリを割り出し、記述子ツリーを更新します。サーブレット仕様では、インジェクション・ターゲットを定義することで、すべてのアノテーションを記述子内に宣言できると規定されています。Webコンテナは、インジェクション・ターゲットで記述子ツリーを更新します。この結果、デプロイメントを継続しながらJNDIツリーが必要なエントリで更新されます。
-
依存関係インジェクション(DI) - DIはインスタンスの作成時に(表7-1で示された型に対して)行われます。リスナーおよびフィルタの場合、これはデプロイメント・フェーズ中に行われます。サーブレットの場合、デプロイメント時または実行時に行われます。
ノート:
Webアプリケーション・コンポーネントでは、1つのDIが失敗すると、同じコンポーネントに対する以後のすべてのDIが無視されます。
Webコンテナによってサポートされるアノテーション
表7-2に、Webコンテナによってサポートされる必要のあるすべてのアノテーションを示します。
表7-2 サポートされるアノテーションのリスト
@アノテーション | 仕様の参照先 |
---|---|
DeclaresRoles |
15.5.1 |
EJB |
15.5.2 |
EJB |
15.5.3 |
PersistenceContext |
15.5.5 |
PersistenceUnit |
15.5.7 |
PersistenceUnits |
15.5.8 |
PersistenceContexts |
15.5.6 |
PostConstruct |
15.5.9 |
PreDestroy |
15.5.10 |
Resource |
15.5.4 |
Resources |
15.5.11 |
WebServiceRef |
15.5.13 |
WebServiceRefs |
15.5.14 |
RunAs |
15.5.12 |
Webコンテナは、Java EEコンテナのアノテーション処理および依存関係インジェクションのメカニズムを利用して、この機能を実現します。
仕様では、web.xml
記述子でmetadata-complete
属性がtrue
に設定されている場合、Webコンテナはアノテーションを処理できないと規定されています。アノテーションが適切に定義され、アノテーション処理が成功し、依存関係が正常に注入されると、アノテーションで記述されたフィールドは正常に初期化され、アノテーションで記述されたメソッドはライフサイクルの適切なフェーズで呼び出されます。DIが失敗すると、これらのアノテーションで記述されたフィールドはnull
になります。
ノート:
サーブレットやフィルタなどのWebコンポーネント・クラス内の複数のメソッドにPostConstruct
またはPreDestroy
アノテーションが付けられている場合、Webコンポーネントではそのようなアプリケーションのデプロイメントに失敗します。同様に、セッションBeanなどのEJBコンポーネント・クラスにPostConstruct
またはPreDestroy
アノテーションが付けられている場合や、EJBインターセプタにPostConstruct
、PreDestroy
、PostActivate
またはPrePassivate
アノテーションが付けられている場合、EJBコンポーネントでもそのようなアプリケーションのデプロイメントに失敗します。
フォルトの検出とリカバリ
アノテーション処理中に障害が発生した場合には、デプロイメント例外が生成され、そのWebアプリケーションのデプロイメントは回避されます。DI中に障害が発生した場合には、その障害の理由を示す警告メッセージがコンテナによってサーバー・ログに書き込まれます。DI障害の発生時には、クラスのインスタンスにあるアノテーションで記述されたフィールドはnull
になり、アノテーションで記述されたライフサイクル・メソッドは一切呼び出されません。
アノテーションによるサーブレットの記述
WebLogicサーブレット・コンテナには、サーブレット用の@WLServlet
アノテーション、およびフィルタ用のWLFilter
アノテーションが用意されています。これらのアノテーションを使用すると、Webアプリケーション内でサーブレットおよびフィルタを開発でき、web.xml
記述子でそれらを宣言する必要がなくなります。WebLogicサーブレット・コンテナには、WLServlet
およびWLFilter
アノテーションを使用して宣言されたサーブレットおよびフィルタの初期化パラメータを指定するためのWLInitParam
アノテーションも用意されています。
必要なメタデータはすべて、サーブレットまたはフィルタ内にアノテーションで記述できます。コンテナはそれらを検出し、そのアノテーションで記述されたサーブレットまたはフィルタがデプロイされるように記述子ツリーを更新します。
ノート:
WebLogic Server 12.1.3以降は、サーブレット4.0仕様で定義されている標準アノテーションが推奨され、WebLogic Server固有のアノテーション(@WLServlet、@WLFilterおよび@WLInitParam)は非推奨となり、将来のリリースで削除されます。
WLServlet
WLServlet
アノテーション(weblogic.servlet.annotation.WLServlet
)を使用してサーブレット・クラスを記述できます。このアノテーションには、サーブレットのパラメータを宣言するための様々な属性を定義します。このアノテーションのすべての属性は、省略可能です。
属性
表7-3 WLServletアノテーションの属性
名前 | 説明 | データ型 | 必須? |
---|---|---|---|
displayName |
デプロイメント後のサーブレットの表示名 |
String |
いいえ |
description |
サーブレットの説明 |
String |
いいえ |
icon |
アイコンの場所 |
String |
いいえ |
name |
サーブレットの名前 |
String |
いいえ |
initParams |
サーブレットの初期化パラメータ |
WLInitParam[] |
いいえ |
loadOnStartup |
サーブレットを起動時にロードすべきかどうか |
int |
いいえ |
runAs |
サーブレットのrun-asユーザー |
String |
いいえ |
mapping |
サーブレットのURLパターン |
String[] |
いいえ |
例7-1に、サーブレット・クラスでのアノテーションの使用方法を示します。
例7-1 WLServletアノテーション
@WLServlet ( name = "FOO", runAs = "SuperUser" initParams = { @WLInitParam (name="one", value="1") } mapping = {"/foo/*"} ) . . .
WebLogicサーブレット・コンテナは、アノテーションを検出し、デプロイメントのためにこのサーブレットをインストールします。Webアプリケーション・デプロイメントのアノテーション処理フェーズ中に、web.xml
記述子に対応する記述子Beanが、このアノテーションに対応する関連エントリで更新されます。
例7-2に、更新後の記述子Beanを示します。
例7-2 更新されたweb.xml記述子
<web-app> . . . <servlet> <servlet-name>FOO</servlet-name> <servlet-class>my.TestServlet</servlet-class> <init-param> <param-name>one</param-name> <param-value>1</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>FOO</servlet-name> <url-pattern>/foo/*</url-pattern> </servlet-mapping> . . . </web-app>
WLFilter
WLFilter
アノテーション(weblogic.servlet.annotation.WLFilter
)を使用してフィルタ・クラスを記述できます。このアノテーションには、フィルタのパラメータを宣言するための様々な属性を定義します。このアノテーションのすべての属性は、省略可能です。
属性
表7-4 WLFilterアノテーションの属性
名前 | 説明 | データ型 | 必須? |
---|---|---|---|
displayName |
デプロイメント後のフィルタの表示名 |
String |
いいえ |
description |
フィルタの説明 |
String |
いいえ |
icon |
アイコンの場所 |
String |
いいえ |
name |
フィルタの名前 |
String |
いいえ |
initParams |
フィルタの初期化パラメータ |
WLInitParam[] |
いいえ |
mapping |
フィルタのURLパターン |
String[] |
いいえ |
例7-3に、フィルタ・クラスでのアノテーションの使用方法を示します。
例7-3 WLFilterアノテーション
@WLFilter ( name = "BAR", initParams = { @WLInitParam (name="one", value="1") } Mapping = {"/bar/*"} ) . . .
WebLogicサーブレット・コンテナは、アノテーションを検出し、デプロイメントのためにこのフィルタをインストールします。Webアプリケーション・デプロイメントのアノテーション処理フェーズ中に、web.xml
記述子に対応する記述子Beanが、このアノテーションに対応する関連エントリで更新されます。
例7-4に、更新後の記述子Beanを示します。
例7-4 更新されたweb.xml記述子
<web-app> . . . <filter> <filter-name>BAR</filter-name> <filter-class>my.TestFilter</filter-class> <init-param> <param-name>one</param-name> <param-value>1</param-value> </init-param> </filter> <filter-mapping> <filter-name>BAR</filter-name> <url-pattern>/bar/*</url-pattern> </filter-mapping> . . . </web-app>
WLInitParam
@WLInitParam
アノテーション(weblogic.servlet.annotation.WLInitParam
)を使用して、@WLServlet
および@WLFilter
アノテーションを使用して宣言されたサーブレットおよびフィルタの初期化パラメータを指定できます。
属性
表7-5 WLFilterアノテーションの属性
名前 | 説明 | データ型 | 必須? |
---|---|---|---|
name |
初期化パラメータの名前 |
String |
いいえ |
value |
初期化パラメータの値 |
String |
いいえ |
例7-5に、WLInitParam
アノテーションの例を示します。
例7-5 WLInitParamアノテーションの例
initParams = {@WLInitParam(name="one", value="1"), @WLInitParam(name="two", value="2")}
前述のアノテーションを使用してサーブレット・クラスまたはフィルタ・クラスを記述することは、web.xml
記述子で例7-6のように初期化パラメータを宣言することと同じです。
例7-6 web.xmlでの初期化パラメータ
. . . <init-param> <param-name>one</param-name> <param-value>1</param-value> </init-param> <init-param> <param-name>two</param-name> <param-value>2</param-value> </init-param> . . .