我对JSF / Primefaces很陌生,所以也许我错误地解决了这个问题,而且我一直在搜索论坛,但没有运气。
我将问题简化为最大值并使用了Damian的@PostConstruct
所以为了恢复,我希望在加载test.xhtml时,我的咆哮通知会弹出 - ,即没有用户交互 ......而且它没有显示,但是当你点击保存按钮时会这样做。
它确实通过了sayHi(),但在那时似乎并不知道容器。
WARNING: FacesMessage(s) have been enqueued, but may not have been displayed.
目标是在数据库访问失败的情况下使用growl显示用户友好的通知。
我必须错过一些我认为的基本原则:(
<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>
@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 "));
}
}
非常感谢
答案 0 :(得分:2)
有可能。当消息添加到bean的构造函数@PostConstruct或preRenderView监听器上时,它会自动显示在页面上,您不必使用任何“onload”事件。 代码的问题在于您没有正确发送消息。这就是你应该这样做的方式:
FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "test", "test");
FacesContext.getCurrentInstance().addMessage(null, msg);
addMessage的第一个参数是有错误的组件的ID,如果是全局错误,则为null。
此外,如果在您的咆哮中您只想显示全局消息,并且您希望仅使用每个组件的p:消息显示特定于组件的错误消息,则应将globalOnly="true"
添加到咆哮。