3

我对 JSF/Primefaces 很陌生,所以也许我以错误的方式处理问题,而且我一直在搜索论坛,但没有运气。

我最大限度地简化了问题并使用了 Damian 的 @PostConstruct

所以要恢复,我希望在加载 test.xhtml 时,我的咆哮通知会弹出 -即没有用户交互......它没有出现,但是当你点击保存按钮时它会出现。

它确实通过了 sayHi() 但此时似乎并不知道容器。

WARNING: FacesMessage(s) have been enqueued, but may not have been displayed.

目的是在数据库访问失败时显示用户友好的咆哮通知。

我一定错过了一些我认为的基本原则:(

测试.xhtml

    <h:form id="form">

        <p:growl id="growl" showDetail="true" showSummary="true" sticky="true" />  

        <h:outputLabel value="#{testGrowl.message}" />

        <p:commandButton value="Save" actionListener="#{testGrowl.save}" update="growl" />  
    </h:form>

TestGrowl.java

@ManagedBean
public class TestGrowl {
private String message;

public TestGrowl()
{
    //sayHi(); commented to try with @PostConstruct
    message = "we've been in the TestGrowl constructor";
}

public String getMessage() {
    return message;
}

public void setMessage(String message) {
    this.message = message;
}

public void save(ActionEvent actionEvent) {  
    sayHi();
}  

@PostConstruct
private void sayHi(){
    FacesContext context = FacesContext.getCurrentInstance(); 
    context.addMessage(null, new FacesMessage("Successful", "Hello "));  
}
}

非常感谢

4

1 回答 1

2

有可能的。当消息添加到bean的构造函数、@PostConstruct或preRenderView监听器时,它会自动显示在页面上,您不必使用任何“onload”事件。您的代码的问题是您没有正确发送消息。你应该这样做:

FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "test", "test");  
FacesContext.getCurrentInstance().addMessage(null, msg);  

addMessage 的第一个参数是发生错误的组件的 ID,如果是全局错误,则为 null。此外,如果在您的咆哮中您只想显示全局消息,并且您希望仅使用每个组件的 p:message 显示特定于组件的错误消息,您应该添加globalOnly="true"到咆哮中。

于 2012-06-18T12:07:39.487 回答