0

数日前、この問題を解決するために mojarra を myfaces に変更しました。現在、複合コンポーネントのレンダリングで奇妙な問題が発生しています。1 つのポップアップを 2 回目に開いたときに単純にレンダリングされません (ポップアップも複合コンポーネントです)。 .

フィールドセットでわかるように、最初はすべて正常にレンダリングされます。 最初に開いた

次に、「CANCELAR」(キャンセル) ボタンをクリックすると、2 回目はダイアログ以外の複合コンポーネントがレンダリングされません。 セカンドオープン

ログを見ると、次のメッセージが見つかりました。

[#|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:popup:

<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 では、このような問題は発生しません。

更新しました

問題は、ユーザーが「CANCELAR」ボタンをクリックしたときに発生します...アクションは次のコードを呼び出して、フィールドをクリアし、ダイアログを閉じます。

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

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

4

2 に答える 2

0

MyFaces のコードは問題ありません。ログは、org.apache.myfaces.renderkit.html.HtmlCompositeComponentRenderer が複合コンポーネント ファイルで c:implementation エントリを見つけられないことを示唆しています詳細については)。後方動作を有効にするために、Web 構成パラメーター (org.apache.myfaces.STRICT_JSF_2_ALLOW_SLASH_LIBRARY_NAME) が追加されましたが、新しい動作は仕様内で明示的に言及されていることに注意してください。

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

アップデート

提供された情報で再現しようとしましたが成功しませんでした。問題は呼び出しです

componente.getFacet("conteudo").getChildren().clear();

このコードは、ファセット内のすべてのコンポーネントを削除します。MyFaces は、削除されたコンポーネントを十分に記憶できます。ビューが復元されると、MyFaces アルゴリズムは最初の要求のようにビューを構築し、コンポーネントを削除して状態を正しく復元します。この動作は予期されたものであるため、MyFaces コードにバグはありません。代わりに、説明されている以前の動作は Mojarra のバグであり、コードを変更して入力コンポーネントを別の方法でリセットする必要があります。おそらく、Bean 内の値をクリアするか、複合コンポーネントにメソッド式属性を作成して、キャンセル操作が発生したときに呼び出され、必要な入力フィールドをクリアします。それを行う方法はたくさんあります。

于 2012-04-10T22:06:23.830 に答える
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;
    }
}

最後に、これをfaces.configに追加しました:

<factory>
    <exception-handler-factory>com.hrgi.web.erp.HRGIExceptionHandlerFactory</exception-handler-factory>
</factory>
于 2012-04-28T14:24:46.733 に答える