在支持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>
答案 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>