contextInialized メソッド内で getServletContext() を呼び出すことはできますか?
-
22-09-2019 - |
質問
を実装するサーブレットの作成 contextInitializer
このコードのインターフェイス、
次に内部のファイルにアクセスします contextinitialized()
この行を使用して
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/file.properties"));
この例外が発生しました
java.lang.NullPointerException at
javax.servlet.GenericServlet.getServletContext(GenericServlet.java:160)
何か案は ?
解決
の ServletContextListener#contextInitialized()
をあなたに与えます ServletContextEvent
を提供する引数 getServletContext()
方法。
したがって、これは次のようにする必要があります。
public void contextInitialized(ServletContextEvent event) {
InputStream input = event.getServletContext().getResourceAsStream("/WEB-INF/file.properties"));
// ...
}
とはいえ、通常はサーブレットにこのインターフェイスを実装させたくありません。聞き手は別の目的を持っています。をオーバーライドするだけです HttpServlet#init()
次のように:
protected void init() throws ServletException {
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/file.properties"));
// ...
}
他のヒント
私は、あなたが参照するインターフェースContextInitializerに慣れていないんだけど、あなたは私の最初の反応を得ている例外に基づいて何が、あなたがcontextInitializedメソッド内のgetServletContextを呼び出すことはできませんということではありません。あなたがチェックアウトする場合は http://www.docjar.com/ HTML / API / javaxの/サーブレット/ GenericServlet.java.html に、あなたはライン160で、のServletConfigからコンテキストを取得しようとしている、と明らかにそのサーブレットのServletConfigオブジェクトが初期化されていない、ということがわかりますまだます。
(私はあなたが作業しているものの環境に慣れていないよので、 -(私の意見では)あなたの最善の策は、あなたがたServletConfigとのServletContextの両方が初期化されているポイントで実行したいとしているコードを実行することです私はそれがどこから来たのか私にはわからないので、私は)、ContextInitializerに精通していないよ、私はできない、本当に助けすぎ限り、サーブレットのライフサイクルが進むにつれてます。
言ったようにあなたがやろうとしている正確に何にもよりますが、静的なフィールドとして、あなたの入力ストリームを持つ検討することができます。あなたのdoGet / doPostメソッドの内部では、あなたはそれが初期化されていますかどうかを確認したい - それは、通常のように、そして偉大な、キャリーを持っている場合。それはしていない場合や、その後、必要に応じてそれを初期化。あなたがどこへ行くか良いことがありますので、あなたのコンテキストおよび設定は、doGetメソッド/ doPostメソッドで利用可能であるべきである。