0

我有一個基於Spring的Wicket應用程序。
有一個池數據源bean。
現在,當MySQL死了的時候,我得到一個帶有堆棧跟蹤的默認Wicket錯誤頁面。Wicket:在哪裏處理JDBC連接錯誤

我想處理這種情況,只允許一些頁面完全顯示(靜態頁面),並顯示其他頁面的自定義錯誤頁面。

我應該如何有效地實施這個?

我知道我可以在頁面的代碼中捕捉異常,但這是一種不可靠的MySQL實例,並且經常下降:)或者,考慮其他類型的不可靠資源。 爲每個頁面添加if似乎效率低下。我想要一些需要該資源的頁面列表,並將請求重定向到一個自定義錯誤頁面。

我在考慮建立一些全球性的boolean isResourceReady,以及一些會在發生錯誤時啓動並定期檢查可用性的線程,並最終在資源返回時允許動態頁面。

感謝您的提示。

Root cause: 

java.net.ConnectException: Connection refused 
at ... java.net stuff 
... JDBC stuff 
... Spring stuff 
... DBCP and Pool stuff 
... Hibernate stuff 
at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:88) 
at cz.oz.wicket.stack.dao.TestEntityDaoImpl$1.doInJpa(TestEntityDaoImpl.java:36) 
at org.springframework.orm.jpa.JpaTemplate.execute(JpaTemplate.java:184) 
at cz.oz.wicket.stack.dao.TestEntityDaoImpl.createSyntheticTestEntity(TestEntityDaoImpl.java:32) 
at cz.oz.wicket.stack.pages.home.HomePage.<init>(HomePage.java:31) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
at org.apache.wicket.session.DefaultPageFactory.createPage(DefaultPageFactory.java:188) 
at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:65) 
at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.newPage(BookmarkablePageRequestTarget.java:298) 
at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.getPage(BookmarkablePageRequestTarget.java:320) 
at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.processEvents(BookmarkablePageRequestTarget.java:234) 
at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:92) 
at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1250) 
at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329) 
at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1428) 
at org.apache.wicket.RequestCycle.request(RequestCycle.java:545) 
at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:479) 
at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:312) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) 
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
at org.mortbay.jetty.Server.handle(Server.java:326) 
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:926) 
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549) 
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) 
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410) 
at org.mo 

回答

2

您可能最好使用the normal error page handling in Wicket

但是如果你想預測異常而不是對它作出反應,這看起來像是一個ServletFilter的自然應用。特別是如果你已經使用了春天的OpenSessionInViewFilter,你可以繼承這一點,覆蓋

protected Session getSession(SessionFactory sessionFactory) 

檢測到你有沒有數據庫連接,並轉發到一個特殊的頁面。

如果你是通過過濾器來做的,是否進入錯誤頁面的決定可能仍然需要某種全局的驅動,但這可能只是你的靜態頁面的列表,您維護在您的WebApplication對象中,該對象已經是一個單例。

0

儘可能降低構造者。 在onInitialize()中做得更多,可以更好地控制錯誤。