使用FacesContext.getCurrentInstance()的自定义消息.addMessage不显示在页面(JSF)中

时间:2010-02-26 11:20:46

标签: java jsf java-ee

我的页面:

...
    <div id="header">
       <!-- content header -->
     </div>
     <div id="content">
       <h:messages />
       <h:ouputText value="#{example.text}" />
     </div>
...

我的managedBean:

public class ExampleManagedBean(){
       private String text;


       public String getText(){
           FacesContext.getCurrentInstance().
                   addMessage(null, 
                      new FacesMessage(FacesMessage.SEVERITY_WARN, 
                                       "Warning message...", null));
           return text;
       }

       public void setText(String text){
           this.text = text;
       }
   }

我的问题是警告信息没有在页面中呈现。为什么呢?

2 个答案:

答案 0 :(得分:3)

我有两个想法。

首先,在getText()getter中添加消息。如果在h:outputText之前呈现h:消息,那么当呈现h:消息时,消息可能不存在。

其次,消息在重定向时消失。

答案 1 :(得分:1)

FacesMessage将发送至&lt; h:messages /&gt;在JSF生命周期的验证阶段。在你的情况下,getter用于派生bean属性值,并且不进行验证,因此消息为空。

理论上,您可以使用setter验证,但这是well known antipattern

您可以“手动”验证,但以不同的方式

 <div id="content">
    <h:messages />
    <h:form>
        <h:outputText value="#{example.text}" />
        <h:commandButton value="Click" action="#{example.action}"/>
    </h:form>
 </div>

并且操作方法是

public String action(){
   FacesContext.getCurrentInstance().
        addMessage(null,
            new FacesMessage(FacesMessage.SEVERITY_WARN,
                                       "Warning message...", null));
           return null;
}

更清洁的方法将使用内置或自定义验证器。