2011-04-14 73 views
0

在我的JSF應用程序中,我需要從託管bean構造函數重定向。我有下面的代碼這樣做:重定向表單託管bean構造函數拋出「java.lang.IllegalStateException」

HttpServletResponse httpServletResponse = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse(); 
httpServletResponse.sendRedirect("HomeV.jsf"); 

但這是拋出以下異常:

java.lang.IllegalStateException 
    at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435) 
    at javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:126) 
    at com.sun.faces.context.ExternalContextImpl.redirect(ExternalContextImpl.java:419) 

我甚至嘗試以下操作:

FacesContext.getCurrentInstance().getExternalContext().redirect("HomeV.jsf"); 

在與此相關的計算器問題中提及here但我仍面臨同樣的例外。

+0

相關:http://stackoverflow.com/questions/4032825/how-to-make-a-redirection-in-jsf/4099405#4099405但在這種特殊情況下,您似乎不需要導航的情況下。根據功能要求,我會使用過濾器。 – BalusC 2011-04-14 12:29:36

回答

2

不要在構造函數中這樣做。我懷疑那裏的迴應是否處於適當的狀態。也許你可以嘗試在@PostConstruct這樣做,但我不保證它會起作用。

理想情況下,您應該通過bean操作方法中的導航規則執行重定向。如果你想在多個動作上重定向,你可以使用一個PhaseListener

+0

+1,@Abhishek你可以添加更多信息你爲什麼這樣做? – 2011-04-14 09:23:10

+0

我也嘗試過這種導航規則。問題如下:我從bean的構造函數中調用一個方法,並編寫導航以處理此方法的結果。該函數從bean中調用並按預期工作,但沒有看到導航發生。我認爲這不起作用的原因是,導航對所執行的操作起作用,而不是如果函數從其他函數調用。我的理解是正確的嗎?有人可以建議任何其他方法 – 2011-04-14 10:01:59

+0

@Ahhishek是的,你是對的。構造函數是不應該用在像JSF/CDI這樣的託管環境中的。爲什麼首先要重定向創建bean? – Bozho 2011-04-14 10:42:33

0

bean也可以在簡單的上下文被初始化時創建,所以這不是一種合適的方法。

相關問題