我想在用户第一次请求页面时显示错误消息。该错误是在请求范围的托管bean的后构造方法中设置的,如下所示:
@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!"
你能帮我吗?
我在使用MyFaces JSF 2.1的WebSphere 7上遇到了同样的问题。
WebSphere似乎过早地刷新了缓冲区,因此messages标记是在@PostConstruct方法完成之前呈现的。然而,我还没有找到一种方法来改变WebSphere的行为,方法是在托管bean中放置一个getter方法来返回一个空字符串,并使用h:ouputText标记来使用我现在有一个呈现消息的页面的值。
例如
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>
我解决了同样的问题,将消息放在bean的第一个声明之后,该声明将生成您想要显示的消息。所以在你上面的例子中,而不是这个:
**<h:messages />**
<h:form>
<h:inputText value="#{myBean.name}" />
</h:form>
试着把它做成这样:
<h:form>
<h:inputText value="#{myBean.name}" />
</h:form>
**<h:messages />**
点击此处查看BalusC的详细解释:如何在@PostConstruct 期间添加Faces消息
希望这能帮助