簡體   English   中英

使用Gatein,JBoss 5.1.0 GA Portlet Bridge Jar和Richfaces錯誤頁面重定向以及我的錯誤

[英]Richfaces error page redirection with gatein, jboss 5.1.0 ga portlet bridge jars and my mistakes

我知道關於相同/相似的主題有很多相似的問題,但是我無法對我的問題應用任何解決方案。

我想在呈現Portlet頁面時捕獲到異常時將用戶重定向到自定義錯誤頁面。 為什么渲染頁面時拋出異常? 這是因為在后台我們將其扔給用戶一些有用的信息,以這種方式設計並且不會在短期內進行更改,因此我的目的是保持這種方式。

我相信,如果我舉個例子,那就更好了:這是我提供使用名稱並按“ >>”按鈕獲取有關該用戶的一些信息的簡單Portlet,在先前的實現中,它的工作原理很好,請參見第二張圖片。

在此處輸入圖片說明

第二張圖片:

如您所見,布局是正確的”(這是它的外觀),錯誤頁面只是用自己的內容替換了portlet內容,並顯示了為什么我們無法獲得有關用戶任何信息的錯誤消息。 到現在為止還挺好。

在此處輸入圖片說明

現在讓我們看一下問題案例:我們已經從jboss 4.2.3 ga升級到5.1.0 ga,現在GateIn開始發揮作用了。 還有一些舊的jar用於創建portlet的視圖,現在它們都已升級為較新的。 如:

(org.richfaces.framework) Richfaces-api 3.3.3-final, 
(org.richfaces.framework) Richfaces-impl 3.3.3-final,
(org.richfaces.framework) Richfaces-ui 3.3.3-final,
(com.sun.faces) jsf-api 2.2.14,
(com.sun.faces) jsf-impl 2.2.14,
(javax-servlet) servlet-api 2.5,
(javax-servlet) jstl 1.2

Gatein version: 3.4

Gatein本身使用了與jsr168兼容的jars +我們有jsf 1.2版本(此版本中使用了標簽)。

問題案例:正如您所看到的那樣,我們想要獲取一些用戶信息的portlet被破壞並合並到域詳細的portlet中。 看起來像湯

產生這種混亂的代碼也屬於我們。 它曾經可以正常工作,但是現在卻以某種方式破壞了整個布局。

在此處輸入圖片說明

讓我向您展示渲染視圖的代碼:

    public void renderView(FacesContext context, UIViewRoot viewToRender) throws java.io.IOException, javax.faces.FacesException{
    try {
        super.renderView(context, viewToRender);
    }catch(FacesException e){         

        Application application = context.getApplication();
        ViewHandler viewhandler = application.getViewHandler();
        PortletRequest request = (PortletRequest)context.getExternalContext().getRequest();
        PortletConfig config = (PortletConfig)request.getAttribute(PortletConstants.PORTLET_CONFIG);
        String errorView = config.getInitParameter(PortletConstants.PORTLET_FACES_ERROR_VIEW);

        if(errorView == null || errorView.matches("")){
            errorView = ProvPortletViewHandler.DEFAULT_FACES_ERROR_VIEW;                       
        }

        Throwable cause = e.getCause();
        FacesMessage fm= findProvisioningException(cause);
        if(fm == null)
        {             
            request.setAttribute("ErrorMessage", "Unknown Error occured");
        }
        else
        {
            request.setAttribute("ErrorMessage", fm.getSummary());
        } 

        viewToRender = viewhandler.createView(context,errorView);         
        context.setViewRoot(viewToRender);             
        viewhandler.renderView(context, viewToRender);

        PortletSession objSes = (PortletSession)context.getExternalContext().getSession(false);
        objSes.invalidate();
    }
}

在這段代碼中,您可以看到存在super.renderView(context, viewToRender);

它一直到達服務並進行服務調用。 服務調用返回此用戶在數據庫中沒有信息的異常。 並且此異常會在路上轉換為FacesException(我們正在這樣做)。

問題不是異常,也不是將其轉換為FacesException。

此部分出現問題

 viewToRender = viewhandler.createView(context,errorView);         
 context.setViewRoot(viewToRender);             
 viewhandler.renderView(context, viewToRender);

據我們調試。 我們相信,由於異常而部分渲染的舊視圖無法替換為錯誤視圖。

但是,如果以前可以正常工作,那該怎么辦。 我們尚未更改代碼的這一部分。

這些信息足以引發有關該問題的想法嗎? 你們需要更多細節嗎? 您認為我們在這里做錯了什么?

感謝和問候

深入研究后,可以看到當請求到達時,此時將創建並填充其響應。 它已經具有HTML內容了。 當嘗試重定向新的jsp文件時,它將新的HTML元素添加到該響應中。 因此,響應中的HTML元素對於Gate-in變得晦澀難懂。 為了避免此問題,重置響應就足夠了。 可以完成重置響應緩沖區,在代碼上可以看到;

     viewToRender = viewhandler.createView(context, errorView);
     context.setViewRoot(viewToRender);
     **((javax.portlet.RenderResponse) context.getExternalContext().getResponse()).resetBuffer();**
     viewhandler.renderView(context, viewToRender);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM