0

同じ/類似のトピックについては、そこに多くの類似の質問がありますが、私は問題に解決策を適用できませんでした。richinsエラーページリダイレクトとgatein、jboss 5.1.0 gaポートレットブリッジjarsと私の間違い

ポートレット・ページのレンダリング中に例外が検出されると、ユーザーをカスタム・エラー・ページにリダイレクトする必要があります。 ページのレンダリング中に例外がスローされるのはなぜですか?バックグラウンドでは、ユーザーにいくつかの有益な情報を提供するために投げ捨てるので、いつでもすぐに変更するつもりはないので、私の意図はそうすることです。

私は例を挙げればいいと思っています: これは単純なポートレットで、私はその名前についての情報を得るために ">>"ボタンを押します。その前の実装では、絵..

enter image description here

セカンド写真:

を使用すると、レイアウトが正しいか見ることができるように「」(これは、それが見えた方法です)エラー ページは、単純に、ポートレットのコンテンツのwiを置き換えています というユーザーについての情報を取得できなかった理由を示すエラーメッセージが表示されます。ここまでは順調ですね。

enter image description here

は今、問題のケースを見てみましょう:私たちは、5.1.0 GAにはjboss 4.2.3 GAからアップグレードした、今GateInは、プレイグラウンドに出ます。また、ポートレットのこのビューを作成するために使用された古いジャーがありましたが、現在はすべて新しいポートレットにアップグレードされています。 ような:

(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互換ジャー+我々はJSF 1.2バージョンを使用しているが(タグバージョンで使用されている)を使用します。

問題ケース: わかるように、いくつかのユーザー情報を取得したいポートレットは、ドメインの詳細なポートレットに壊れて結合されています。スープのように見える。

この混乱を生成するコードも、私たちのものです。一度は正しく動作していましたが、現在はレイアウト全体が何とか破壊されています。

enter image description here

私はあなたのビューをレンダリングしているコードを表示してみましょう:コードのこの部分で

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);

があることがわかりますそれはすべての道を行きますサービスに呼び出し、サービスコールを行います。サービスコールは、このユーザがDBに情報を持っていないという例外を返します。この例外は道路上のFacesExceptionに変換されます(私たちはそれをやっています)。

問題は例外ではなく、FacesExceptionに変換することもありません。

問題は、この一環として、これまで私たちがデバッグとして

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

で発生します。何らかの理由で、例外のために部分的にレンダリングされた古いビューをエラービューに置き換えることはできません。

しかし、それが以前に動作していた場合はどうすればよいでしょうか。私たちはコードのこの部分を変更していません。

この情報は、この問題について考えてもらえますか? 詳細をお知りになりたいですか? ここで間違っていると思いますか?

深い見た後おかげ&に関して

答えて

0

、要求が来たときに、その応答が作成され、この時点で満たされていることがわかります。内部に既に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); 
関連する問題