2016-04-13 25 views
1

我已通過@WebListener註釋在Java Servlet網絡應用程序中實現了ServletContextListener。在我的contextInitialized方法中,我做了一些設置工作並驗證預期的資源是否可用。停止從ServletContextListener方法contextInitialized啓動Web應用程序

如果我確定在contextInitialized方法中出現問題,我該如何停止Web應用程序繼續執行servlet?如果環境不適合(如沒有數據庫可用),那些servlet不應執行。

如何正常處理基於servlet的Web應用程序的錯誤環境?

+0

您是否嘗試拋出異常? –

回答

2

不,看起來ServletContextListener界面是而不是旨在能夠阻止啓動的Web應用程序。

由於this Answer狀態,在Servlet規範說遇到異常時,ServletContextListener可以某種程度上禁止訪問的Web應用程序。該詞may表示可選,不是必需的。該規範也沒有明確規定停止訪問Web應用程序的意義。

顯然,在各種網絡容器中實施的行爲差異很大。有些什麼都不做,有些登錄並繼續前進,有些則阻止部署Web應用程序。

我與Tomcat 8.0.33的經驗...將throw new RuntimeException ("bogus stop servlet ");置於contextInitialized方法可防止應用程序被部署。在IDE報告中進行部署期間,控制檯報告「FAIL - 在上下文路徑處部署的應用程序/但上下文無法啓動」。不幸的是,控制檯和日誌都沒有捕獲實際異常的報告。因此,如果您從一個或多個偵聽器中拋出多個Exception,則調試將不明顯。

正如Stack Overflow中的其他地方所提到的,最可靠的解決方案可能是讓您的ServletContextListener標記成功或失敗,標記變量存儲在servlet會話中。然後讓你的servlet代碼檢索並檢查該標誌。然後您的servlet代碼將確定適當的操作過程。您的Web應用程序將被部署,但您自己的Servlet可能會選擇不做任何事情併發送一些HTTP錯誤代碼。

類似的問題:

備註:在添加或編輯您的ServletContextListener時,您可能需要對您的項目執行「清理並構建」操作。您的IDE熱插拔或部署開發功能可能無法在新的或已更改的偵聽器上拾取。跟蹤你的代碼或做一些日誌記錄來驗證。

相關問題