19.7.4 テストモードでのJ2EEアプリケーション呼び出し時の注意事項

アプリケーションの動作モードには,本番稼働できる通常モードと,テスト専用のテストモードの二つがあります。

テストモードは,アプリケーションの新規開発や,アプリケーションの入れ替えなど,アプリケーションをテストするときに利用します。なお,テストの対象となるのは,WebアプリケーションとEnterprise Beanです。

<この項の構成>
(1) テストモードでのWebアプリケーション呼び出しについての注意事項
(2) テストモードでのEnterprise Bean呼び出しについての注意事項

(1) テストモードでのWebアプリケーション呼び出しについての注意事項

アプリケーションの作りによっては,テストモードでのWebアプリケーション呼び出し機能が利用できないことがあります。注意事項を次に説明します。

(a) ほかのWebアプリケーションとのリンクを作成する場合

テストモードで起動するJ2EEアプリケーションに複数のWebアプリケーションが含まれている場合,そのWebアプリケーションから,同じくテストモードで起動されたWebアプリケーションへのリンク(URLまたはURI)を作成する処理が含まれることがあります。この場合,サーブレットAPIでほかのWebアプリケーションのコンテキストルートは取得できないため,Webアプリケーションで固定またはユーザプログラム内の定義で指定していると考えられます。

この場合,テストモードのWebアプリケーションにアクセスし,作成されたページのリンクにアクセスすると,テストモードのWebアプリケーションではなく,通常モードのWebアプリケーションにアクセスするので注意してください。

(b) 静的コンテンツ内のリンクがコンテキストルートからのパスで記述されている場合

静的コンテンツ内で記述しているリンクが,相対パスではなくコンテキストルートからのパスで記述してある場合,通常モードのWebアプリケーションにアクセスしてしまいます。

(c) サーブレットAPIを利用する場合

サーブレットAPIで使用するメソッドによっては,次に示す注意が必要になる場合があります。

注意事項A:
引数にコンテキストルート名をハードコーディングしたり,戻り値として特定のコンテキストルート名が返されることを期待したりしないでください。
注意事項B:
戻り値としてファイルシステム上の実際のパスが返されます。特定のファイルパスが返されることを期待しないでください。

注意事項Aおよび注意事項Bに該当するメソッドを,次の表に示します。

表19-11 注意が必要なサーブレットAPI

パッケージクラスメソッド注意事項
AB
javax.servletServletContextgetContext(java.lang.String uripath) 
getResource(java.lang.String path) 
getRealPath(java.lang.String path) 
javax.servlet.httpHttpServletRequestgetContextPath() 
getPathTranslated() 
getRequestURI() 
getRequestURL() 
getPathTranslated() 
HttpServletResponseencodeRedirectUrl(java.lang.String url) 
encodeRedirectURL(java.lang.String url) 
encodeUrl(java.lang.String url) 
encodeURL(java.lang.String url) 
sendRedirect(java.lang.String location) 
CookiegetPath() 
setPath(java.lang.String uri) 
HttpServletRequestWrappergetContextPath() 
getPathTranslated() 
getRequestURI() 
getRequestURL() 
getPathTranslated() 
HttpServletResponseWrapperencodeRedirectUrl(java.lang.String url) 
encodeRedirectURL(java.lang.String url) 
encodeUrl(java.lang.String url) 
encodeURL(java.lang.String url) 
sendRedirect(java.lang.String location) 
HttpUtilsgetRequestURL(HttpServletRequest req) 

(凡例)○:注意事項に該当することを示します。


(2) テストモードでのEnterprise Bean呼び出しについての注意事項

Enterprise Beanの場合,一般にEJBホームオブジェクトおよびEJBローカルホームオブジェクトの取得にJNDIを利用します。したがって,通常モード用とは別にテストモード用の名前空間を設け,JNDIで通常/テストのモード切り替えを実施することで,テストモードでのEnterprise Beanの呼び出しを実現します。テストモードでのEnterprise Beanの呼び出しについての注意事項を次に示します。

(a) Enterprise Beanを開始する場合

Enterprise Beanを含むJ2EEアプリケーションをテストモードで開始するとき,テストモードで開始されたEnterprise BeanのEJBホームオブジェクト,およびEJBローカルホームオブジェクトなどをテストモード用の名前空間に登録します。テストモード用名前空間への登録/検索については,JNDIで自動変換して実行するため,J2EEアプリケーションに本番/テストのモード変更が発生しても,lookupメソッド呼び出し元のソースや,WAR,Enterprise BeanなどのDD定義の変更は不要です。

(b) クライアントから接続する場合

クライアントでは,テストモード用の名前空間を検索してEJBホームオブジェクト,およびEJBローカルホームオブジェクトなどを取得します。

J2EEアプリケーション形態のEnterprise Beanのクライアント(例:JSP/サーブレットやEnterprise Bean)では,JNDIがlookupメソッド呼び出し元(クライアント)のJ2EEアプリケーションのモードを判別して自動的に検索名を変換するため,クライアント側ではテストモードの検索名を意識しなくて済みます。

一方,J2EEアプリケーション形態以外のEnterprise Beanのクライアント(例:EJBクライアントアプリケーション)では,JNDIでは自動的に検索名を変換しません。そのため,クライアント側では,テストモードの検索名を意識し,テスト用のクライアントを作成してください(J2EEアプリケーション形態以外のEnterprise Beanのクライアントには,通常モード/テストモードの区別がありません。このため,JNDIでは,検索名の自動変換は実行されません)。

(c) ダイナミッククラスローディング機能を使用する場合

ダイナミッククラスローディング機能を使用する場合,一つのJ2EEサーバ上で通常モードとテストモードのJ2EEアプリケーションを,同じ名称で同時に開始できません。例えば,すでに通常モードでJ2EEアプリケーションが動作しているときにテストモードのJ2EEアプリケーションを開始しようとすると,開始に失敗します。

テストモードでJ2EEアプリケーションを動作させる場合は,ダイナミッククラスローディング機能を使用しないことをお勧めします。