如何在@PostConstruct期间添加Faces消息

时间:2012-04-17 18:52:59

标签: jsf-2

在支持bean的@PostConstruct方法中,我调用了一个EJB,它可能会返回一些我希望通过p:消息在页面上显示的消息。但是,即使我添加了FacesMessages,例如FacesContext.getCurrentInstance()。addMessage(...),p:消息未使用FacesMessages进行更新。

如果我在页面上的操作上调用EJB调用(比如用户单击页面上的一个按钮,该按钮调用调用EJB的方法,然后添加FacesMessage(s)),那么messags显示按预期使用p:消息。

如何在@PostConstruct期间添加Faces消息并在最初呈现页面时显示它们?

代码:

Page1Controller.java:

@ManagedBean
public class Page1Controller
{
    @PostConstruct
    public void init()
    {
        FacesContext.getCurrentInstance().addMessage(null, 
            new FacesMessage("Test Message from @PostConstruct"));
    }

    public String getValue()
    {
            return "Some Value";
    }

    public void triggerMessage(ActionEvent event)
    {
            FacesContext.getCurrentInstance().addMessage(null, 
                    new FacesMessage("Test Message from Trigger Button"));      
    }

}

page1.xhtml

   <h:form>
        <p:messages showDetail="true" showSummary="true" autoUpdate="true"/>
        <h:outputText value="#{page1Controller.value}"/>
        <br/>
        <p:commandButton value="Trigger Message" 
                         actionListener="#{page1Controller.triggerMessage}"/>  
   </h:form>

3 个答案:

答案 0 :(得分:18)

在您的特定示例中,{<1}}在第一次构造托管bean之前呈现。然后添加消息为时已晚。在渲染时评估<p:messages>的值时,您的bean首次构建。

您需要以某种方式确保在呈现<h:outputText>之前构造 bean。在您的特定示例中,您可以通过在 <p:messages>之前将<h:outputText>移至来实现此目的。或者,通过添加<p:messages><f:viewAction>,在整个渲染之前调用,就像您自己发现的一样。顺便说一句,添加消息不一定需要在侦听器方法中进行。

另见:

答案 1 :(得分:1)

您可以收集错误,然后使用具有autorun = true模式的primefaces的remoteCommand在加载页面结束时显示它。 在我的例子中,我有一个viewScope,在xhtml中我显示了@PostConstruct中加载的值列表。如果生成了异常,我将在页面加载结束时将其保存到示例中(如果使用remoteCommand存在它)。

private ArrayList<Exception> postConstucError = new ArrayList<>();

@PostConstruct
public void validarAcceso() {
    /**
     * verificar permisos a la vista de coeficientes
     */
    try {
            this.init() //load data;
        } catch (Exception e) {
        System.out.print(e.getMessage());
        this.postConstucError.add(e);
    }
}

 public void showPostConstructError() {
    try {
        for (int i = 0; i < this.postConstucError.size(); i++) {
            JsfUtil.addErrorMessage("Error al cargar datos iniciales: " + postConstucError.get(i).getMessage());
        }
    } catch (Exception e) {
        JsfUtil.addErrorMessage(e, "Error: showPostConstructError() " + e.getMessage());
    }
}

xhtml代码

  <p:messages id="messages" showDetail="true" autoUpdate="true" closable="true"/> 
  <h:form>
        <p:remoteCommand id="rcomerror" name="showError" process="@this"  autoRun="true"
                         actionListener="#{mBPresentNinos.showPostConstructError()}" />  
    </h:form>

答案 2 :(得分:0)

对于我使用preRenderView事件在表单上显示消息init是一个消息 - 地狱。所以我创建了非常简单的&#34;组件&#34;保持静态消息。对于此示例,仅支持一条错误消息。

<强> staticMessage.xhtml:

<ui:fragment xmlns="http://www.w3.org/1999/xhtml"
             xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
             rendered="#{rendered}">
    <div id="staticMessage" class="ui-messages ui-widget" aria-live="polite">
        <div class="ui-messages-error ui-corner-all"><span class="ui-messages-error-icon"/>
            <ul>
                <li>
                    <span class="ui-messages-error-summary">#{value}</span>
                </li>
            </ul>
        </div>
    </div>
</ui:fragment>

包含消息:

 <ui:include src="/template/components/staticMessage.xhtml">
     <ui:param name="rendered"value="#{beanMB.staticMessagesRendered}"/>
     <ui:param name="value" value="Place your message here."/>
 </ui:include>