在没有h:messages标记的jsf 2中显示内联错误消息

时间:2014-08-16 06:14:56

标签: jsf jsf-2 facelets

我正在研究JSF2应用程序,我试图通过显示内联消息或弹出错误来向所有xhtmls添加异常处理。

例如,如果支持bean中发生服务异常,我将其包装在我的自定义UI异常中并重新抛出它,如下所示,其中第二个参数指示是否使用弹出消息或内联消息通知用户有关异常的信息

throw new UIException(e, true);

在我的异常处理程序包装器中,我拦截了这个异常并基于第二个参数我试图在弹出或内联中显示错误。对于弹出窗口,我有一个rich:popupPanel,我已将其包含在基页中,其中所有xhtmls都包含在应用程序中。因此,在exceptionHandler包装器中,我将动态添加弹出到渲染ID,如下所示。

FacesContext.getCurrentInstance().getPartialViewContext() .getRenderIds().add("popupForm:popupErrorPanelGroup");

对于内联消息,我想在我的基础xhtml中添加一个内联片段,并希望以类似的方式在行消息中显示错误。这种方法的问题是消息定位不正确,内联消息应该显示在单个表单的顶部,但现在它显示在应用程序的顶部。为此,我必须手动在每个xhtml中包含我的inlineexception xhtml。

内联异常xhtml:

<h:panelGroup styleClass="error" rendered="#{errorInlineBackingBean.showError}">
        <h:outputText id="errorText"
            value="#{errorInlineBackingBean.errorMsg}" />           
    </h:panelGroup>

是否可以在基页中包含此inlineException,类似于弹出方法并在应用程序中以任何形式显示?我想避免在每个xhtml中包含重复的代码,或者将h:messages标记放在所有xhtmls中。

1 个答案:

答案 0 :(得分:0)

您可以定义一个复合组件,您将以某种方式覆盖h:form并在其上添加h:message或代码包含。

这是一个例子:

<!--?xml version='1.0' encoding='UTF-8' ?-->
     <!-- INTERFACE -->
     <cc:interface>
         <cc:attribute name="id">
         <cc:attribute name="prependId">
     </cc:attribute></cc:attribute></cc:interface>

     <!-- IMPLEMENTATION -->
     <cc:implementation>
         <h:form id="#{cc.attrs.id}" prependid="#{cc.attrs.prependId}">
             <h:messages/>
             <cc:insertchildren></cc:insertchildren>
             <h:panelGroup styleClass="error" rendered="#{errorInlineBackingBean.showError}">
                  <h:outputText id="errorText" value="#{errorInlineBackingBean.errorMsg}" />           
             </h:panelGroup>
        </h:form>
    </cc:implementation>

我很久以前发布了一篇关于同一概念的博文:http://faissalb.blogspot.ca/2011/08/composite-component-to-tweak-forms.html?m=1