2016-04-13 71 views
1

@WebListenerアノテーションを使用してJava ServletウェブアプリケーションにServletContextListenerを実装しました。私のcontextInitializedメソッドでは、いくつかのセットアップ作業を行い、予想されるリソースが利用可能であることを確認します。`ServletContextListener`メソッド` contextInitialized`からWebアプリケーションの起動を停止します

contextInitializedメソッドで何かが間違っていると判断した場合、Webアプリケーションがサーブレットを実行するのを続行しないようにするにはどうすればよいですか?これらのサーブレットは、環境が適切でない(実行可能なデータベースがないなど)場合には実行しないでください。

サーブレットベースのWebアプリケーションで問題のある環境を正常に処理するにはどうすればよいですか?

+0

例外をスローしようとしましたか? –

答えて

2

いいえ、ServletContextListenerインターフェイスはではなく、ウェブアプリの起動を妨げるように設計されています。this Answer状態として

、サーブレット仕様では、例外が発生したときServletContextListener何とかWebアプリケーションへのアクセスを無効にすることが言います。その単語mayは必須ではありません。また、この仕様では、Webアプリケーションへのアクセスを停止する意味を明確に定義していません。

明らかに、さまざまなWebコンテナで実装された動作は大きく異なります。いくつかは何もせず、ログに記録して移動したり、Webアプリケーションの展開を妨げるものがあります。

Tomcat 8.0.33での私の経験throw new RuntimeException ("bogus stop servlet ");contextInitializedメソッドに入れると、アプリケーションが展開されなくなります。 IDEレポートの展開中のコンソールで、「FAIL - コンテキストパスでデプロイされたアプリケーション/コンテキストが開始できませんでした」というメッセージが表示されます。残念なことに、そのコンソールもログも実際の例外のレポートを取得しません。したがって、1つまたは複数のリスナーから複数の例外をスローすると、デバッグは明白ではありません。

スタックオーバーフローの他の部分で説明したように、最も信頼性の高い解決策は、サーブレットセッションに格納されたフラグ変数を使用してServletContextListenerの成功または失敗をマークすることです。サーブレットコードを取得してそのフラグを調べます。あなたのサーブレット・コードは、適切なアクション・コースを決定します。 Webアプリケーションはデプロイされますが、独自のサーブレットは何もせずにHTTPエラーコードを返すこともできます。

同様の質問:

注:ServletContextListenerを追加または編集する場合は、プロジェクトで「クリーンアンドビルド」操作を行う必要があります。 IDEのホットスワップまたは開発中のデプロイメント機能は、新規または変更されたリスナーでは取得できないことがあります。コードをトレースするか、確認するためにいくつかのログを作成します。

関連する問題