0

几天前我将 mojarra 更改为 myfaces 来解决这个问题,现在我在渲染我的复合组件时遇到了一个奇怪的问题,当我第二次打开一个弹出窗口时它们根本没有渲染(弹出窗口也是一个复合组件) .

第一次,正如您在 fieldset 中看到的,一切正常: 第一次打开

然后我点击“CANCELAR”(取消)按钮,第二次,除了对话框,我的复合组件都没有被渲染: 二开

当我查看日志时,我发现了这些消息:

[#|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 没有显示出任何这样的问题!

更新

问题只是在用户单击“取消”按钮时发生......该操作调用此代码以清除字段并关闭对话框:

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

此代码改编自您可以在此处看到的方法。在这种情况下,仅重新创建 facet conteudo 内的组件。工作正常,除了我的复合组件。

4

2 回答 2

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 问题跟踪器中创建一个问题。这样一来,它就有更好的机会在未来的版本中得到解决。

更新

我试图用提供的信息复制它,但没有成功。问题是调用

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 回答