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

Bes*_*ces 19 jsf message pageload postconstruct

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

如果我不是调用从页面的动作调用EJB(比如用户点击它调用调用EJB的方法在页面上的一个按钮,然后添加的FacesMessage(S)),那么messags显示用对:消息按预期.

如何在@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"));      
    }

}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 18

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

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

也可以看看:

  • 现在,这对JSF来说是一个真正的挫折......屏幕上显示的消息不应该这么难. (14认同)