如何从请求范围bean的PostConstruct方法显示FacesMessage?

时间:2011-05-28 17:11:07

标签: jsf

我想在用户第一次请求页面时显示错误消息。该错误在请求范围的托管bean的post构造方法中设置,如下所示:

@RequestScoped
public class MyBean {

    private String name;

    @PostConstruct
    public void init() {
        // some validations here
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "You have no credit!");
        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, message);
        context.renderResponse();
    }

    public String getName() {
        return name;
    }
}

然后在我的JSF页面中:

<!-- I'm expecting the error you have no credit will be displayed here -->
<h:messages />
<h:form>
    <h:inputText value="#{myBean.name}" />
</h:form>

在开发阶段运行时,JSF抱怨这是一条未处理的消息:

"Project Stage[Development]: Unhandled Messages - You have no credit!"

你能帮助我吗?

2 个答案:

答案 0 :(得分:2)

我在使用MyFaces JSF 2.1的WebSphere 7上遇到了同样的问题。

似乎WebSphere过早地刷新缓冲区,因此在@PostConstruct方法完成之前呈现messages标记。我还没有找到改变WebSphere行为的方法,但是通过在托管bean中放置一个getter-method来返回一个空字符串并使用ah:ouputText标签来使用我现在有一个呈现我的消息的页面的值。

e.g。

BackingBean.class

@ManagedBean
@RequestScopped
public class BackingBean {
    public String getEmptyString { return ""; }
}

BackingBean.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">
<h:head></h:head>
<body>
<h:outputText value="#{backingBean.emptyString"/>

...

</body>
</html>

答案 1 :(得分:2)

我通过在第一次声明bean之后放置消息来解决同样的问题,该bean预期会产生您想要显示的消息。所以在上面的例子中,而不是这个:

**<h:messages />**
<h:form>
    <h:inputText value="#{myBean.name}" />
</h:form>

尝试这样做:

<h:form>
    <h:inputText value="#{myBean.name}" />
</h:form>
**<h:messages />**

在此处查看BalusC的更详细说明: How can I add Faces Messages during @PostConstruct

希望这有帮助