gpt4 book ai didi

jsf - 如何在页面加载期间添加 FacesMessage?使用@PostConstruct似乎不起作用

转载 作者:行者123 更新时间:2023-12-02 07:40:32 32 4
gpt4 key购买 nike

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

如果我改为在页面上的操作上调用对 EJB 的调用(假设用户单击页面上的按钮,该按钮将调用调用 EJB 的方法,然后添加 FacesMessage),则消息将显示按预期使用 p:messages 。

如何在 @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>

最佳答案

当消息组件在添加消息之前呈现时,可能会发生这种情况。

在您的具体示例中,<h:outputText> 首次引用该 bean组件,因此在那一刻第一次构建。但是<h:outputText>组件出现在您的特定示例中 <p:messages> 之后组件,所以<p:messages>组件已经渲染,因此显示消息为时已晚。

您需要以某种方式确保在呈现消息组件之前添加消息。一种方法是使用 <f:viewAction> 。它在INVOKE_APPLICATION期间运行RENDER_RESPONSE之前的阶段阶段。因此它在渲染任何组件之前运行。这是一个绝佳的机会。

<f:metadata>
<f:viewAction action="#{bean.onload}" />
</f:metadata>

public void onload() {
// Add message here instead of in @PostConstruct.
}

另请参阅:

关于jsf - 如何在页面加载期间添加 FacesMessage?使用@PostConstruct似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10197277/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com