2012-04-10 28 views
0

いくつかの日前にmojarraをmyfacesに変更してthis problemを解決しました。複合コンポーネントのレンダリングに奇妙な問題があります。 1つのポップアップ(ポップアップも複合コンポーネントです)。あなたはすべてがOKにレンダリングされ、フィールドセットで見ることができるようJSF 2.0 - 複合コンポーネントのレンダリングに問題がある

初めて、: first open

、私は除いて、「CANCELAR」(キャンセル)ボタン、2回目、私の複合コンポーネントのどれを中クリックダイアログが、レンダリングされる: second open

私は、ログ見てきたとき、私はこれらのメッセージを見つけました:

[#|2012-04-10T15:22:00.681-0300|SEVERE|glassfish3.1.1|org.apache.myfaces.renderkit.html.HtmlCompositeComponentRenderer|_ThreadID=19;_ThreadName=Thread-2;|facet UIComponent.COMPOSITE_FACET_NAME not found when rendering composite component prevenda:popupPreVenda:j_id_2uz|#] 
[#|2012-04-10T15:22:00.684-0300|SEVERE|glassfish3.1.1|org.apache.myfaces.renderkit.html.HtmlCompositeComponentRenderer|_ThreadID=19;_ThreadName=Thread-2;|facet UIComponent.COMPOSITE_FACET_NAME not found when rendering composite component prevenda:popupPreVenda:inputRazaoSocial|#] 
[#|2012-04-10T15:22:00.685-0300|SEVERE|glassfish3.1.1|org.apache.myfaces.renderkit.html.HtmlCompositeComponentRenderer|_ThreadID=19;_ThreadName=Thread-2;|facet UIComponent.COMPOSITE_FACET_NAME not found when rendering composite component prevenda:popupPreVenda:j_id_2vi|#] 
[#|2012-04-10T15:22:00.685-0300|SEVERE|glassfish3.1.1|org.apache.myfaces.renderkit.html.HtmlCompositeComponentRenderer|_ThreadID=19;_ThreadName=Thread-2;|facet UIComponent.COMPOSITE_FACET_NAME not found when rendering composite component prevenda:popupPreVenda:j_id_2vn|#] 
[#|2012-04-10T15:22:00.686-0300|SEVERE|glassfish3.1.1|org.apache.myfaces.renderkit.html.HtmlCompositeComponentRenderer|_ThreadID=19;_ThreadName=Thread-2;|facet UIComponent.COMPOSITE_FACET_NAME not found when rendering composite component prevenda:popupPreVenda:j_id_2vs|#] 

あなたが見ることができるように、問題はMyFacesのファセットを見つけることができないということです複合コンポーネントで...ファセットを使用しています 唯一の複合コンポーネントはhrgiです:ポップアップ:

<c:interface> 
    <c:attribute name="titulo" default="sem titulo" required="false"/> 
    <c:attribute name="renderizar" default="false" required="false"/> 
    <c:attribute name="modal" default="true" required="false"/> 
    <c:attribute name="bordaConteudo" default="true" required="false"/> 
    <c:facet name="cabecalho" required="false"/> 
    <c:facet name="conteudo" required="true"/> 
    <c:facet name="botoes" required="true"/> 
</c:interface> 

<c:implementation> 
<h:outputStylesheet library="css" name="hrgiPopup.css" target="head"/> 
<h:outputStylesheet library="css" name="clearfix.css" target="head"/> 
<h:outputScript library="js" name="hrgiPopup.js" target="head"/> 
<h:panelGroup layout="block" rendered="#{cc.attrs.renderizar}" 
       class="hrgi-dialog-panel clearfix"> 
    <h:panelGroup layout="block" class="hrgi-dialog-overlay clearfix" rendered="#{cc.attrs.modal}"></h:panelGroup> 
    <h:panelGroup id="popup" layout="block" class="hrgi-dialog-box clearfix"> 
     <h:panelGroup layout="block" class="hrgi-dialog-title clearfix"> 
      <h:outputText style="float:left" value="#{cc.attrs.titulo}"/> 
     </h:panelGroup> 
     <h:panelGroup layout="block" class="hrgi-dialog-content clearfix"> 
      <c:renderFacet name="cabecalho" required="false"/> 
      <h:panelGroup layout="block" class="hrgi-dialog-background clearfix" 
          rendered="#{cc.attrs.bordaConteudo}"> 
       <c:renderFacet name="conteudo" required="true"/> 
      </h:panelGroup> 
      <h:panelGroup layout="block" class="clearfix" rendered="#{not cc.attrs.bordaConteudo}"> 
       <c:renderFacet name="conteudo" required="true"/> 
      </h:panelGroup> 
      <c:renderFacet name="botoes" required="true"/> 
      <script type="text/javascript"> 
       cercarEventoTab("#{cc.clientId}:popup"); 
      </script> 
     </h:panelGroup> 
    </h:panelGroup> 
</h:panelGroup> 
</c:implementation> 

これはMyFacesののバグです? Mojarraはこのような問題は何も表示していません!

public void cancelar(ActionEvent evento){ 
    fechar(); 
    UIComponent componente=evento.getComponent().getParent().getParent().getParent(); 
    componente.getFacet("conteudo").getChildren().clear(); 
} 

このコードが適応されました:問題は、単にユーザが「CANCELAR」ボタンをクリックしたときに...アクション呼び出しこのコードフィールドをクリアし、ダイアログを閉じるに起こる

を更新し

あなたが見ることができるアプローチからhere。この場合、ファセット内のコンポーネントだけが再作成されます。私の複合コンポーネントを除いて正常に動作します。

答えて

0

私はなぜ知らないが、私は例外を処理するために、いくつかのクラスを作成した後に、この問題が消えた...

public class HRGIExceptionHandler extends ExceptionHandlerWrapper { 

    private ExceptionHandler wrapped; 

    public HRGIExceptionHandler(ExceptionHandler wrapped) { 
     this.wrapped = wrapped; 
    } 

    @Override 
    public ExceptionHandler getWrapped() { 
     return wrapped; 
    } 

    @Override 
    public void handle() throws FacesException { 
     Iterator i = getUnhandledExceptionQueuedEvents().iterator(); 
     while (i.hasNext()) { 
      ExceptionQueuedEvent event = (ExceptionQueuedEvent) i.next(); 
      ExceptionQueuedEventContext context = (ExceptionQueuedEventContext)event.getSource(); 
      Throwable t = context.getException(); 
      try{ 
       t.printStackTrace(); 
      }finally{ 
       i.remove(); 
      } 
     } 
     getWrapped().handle(); 
    } 
} 

public class HRGIExceptionHandlerFactory extends ExceptionHandlerFactory { 

    private ExceptionHandlerFactory parent; 

    public HRGIExceptionHandlerFactory(ExceptionHandlerFactory parent) { 
     this.parent = parent; 
    } 

    @Override 
    public ExceptionHandler getExceptionHandler() { 
     ExceptionHandler result = new HRGIExceptionHandler(parent.getExceptionHandler()); 
     return result; 
    } 
} 

は最終的に私はこれを追加しましたto faces:config:

<factory> 
    <exception-handler-factory>com.hrgi.web.erp.HRGIExceptionHandlerFactory</exception-handler-factory> 
</factory> 
0

MyFacesのコードは問題ありません。ログはorg.apache.myfaces.renderkit.html.HtmlCompositeComponentRendererがコンポジットコンポーネントファイル内のc:implementationエントリを見つけることができないことを示唆します。2.1.6以降、libraryName内の '/'文字の使用を防ぐためにいくつかの変更が行われました(詳細はMYFACES-3454を参照してください)。 )。 Web設定パラメタ(org.apache.myfaces.STRICT_JSF_2_ALLOW_SLASH_LIBRARY_NAME)が追加され、後方動作が可能になりましたが、新しい動作は仕様の中に明示的に記載されています。

それでも解決しない場合は、MyFaces Issue Trackerに簡単なデモアプリケーションを作成して問題を再現してみてください。そのようにして、将来のリリースで解決される可能性の高いチャンスがあります。

UPDATE

私は成功せず、提供された情報とそれを再現してみました。問題は、ファセット内のすべてのコンポーネントを削除し、削除されたコンポーネントを覚えておくことができるスマートです。ビューが復元されると、MyFacesアルゴリズムは最初の要求と同様にビューを構築し、コンポーネントを削除して状態を正しく復元します。この動作は予期されるので、MyFacesコードにはバグはありません。代わりに、私は前に説明した動作はMojarraのバグだと思います。入力コンポーネントを別の方法でリセットするコードを変更して、Bean内の値をクリアするか、コンポジットコンポーネントにメソッド式属性を作成する必要がありますキャンセル操作が発生したときに呼び出され、必要な入力フィールドをクリアします。それを行う方法はたくさんあります。

+0

ウェブ設定が役に立たなかったため、複合コンポーネントタグの宣言が間違っているとは限りません。xmlns:hrgi = "ht tp://java.sun.com/jsf/composite/hrgi "を参照してください。新しい情報を追加しました。あなたの注意をお寄せいただきありがとうございます。 – brevleq

+0

私は、 "componente.getFacet(" conteudo ")。getChildren()。clear();" 2番目のアプローチからは、https://cwiki.apache.org/MYFACES/clear-input-components.htmlをご覧ください。私のコンポジットコンポーネントで問題のないページのすべてのコンポーネントをクリアできる別の方法はありますか? – brevleq

関連する問題