如何避免多次显示FacesMessage?

时间:2015-06-02 16:31:25

标签: jsf-2

我需要为此组件显示FacesMessage,如下所示, enter image description here

问题是它在UI上多次显示,如下所示, enter image description here

其次,输入的日期为40.06.2015,这是无效的,因此FacesMessage,但它已转换为10.07.2015。我不知道如何防止这种情况。任何帮助都非常感谢。我知道可以使用setLenient()类上的DateFormat轻松处理它,但不知何故,在我提供后,UI组件会将其转换为下个月的日期。

附加到此组件的验证器如下: enter image description here

那么,如何避免多次显示“请以正确的格式输入日期”?

我想过使用h:message而不是h:messages,并且在验证器方法的catch块中这样做

FacesContext.getCurrentInstance().addMessage("formId:aboveCompId", message);

但UI上没有显示任何内容。有什么建议吗?

1 个答案:

答案 0 :(得分:4)

这种方法至少存在两个问题。

  1. 您将组件绑定到bean属性。症状表明bean不是请求作用域。这是一个非常糟糕的主意。 UI组件本质上是请求范围的,不应该在更广泛的范围内绑定为bean的属性,否则JSF将重用它们而不是创建新的。如果你继续这样做,所有标记处理程序(包括验证程序绑定)将在同一个bean上的请求之间在同一个UI组件实例上反复运行,从而在每次回发时累积(你会在每次回发时看到越来越多的消息)相同的视图,由同一个验证器重新连接到同一个组件实例引起。)

  2. 您在验证器中手动添加了一条面部消息,而不是在其中抛​​出一个ValidatorException面部消息。因此,JSF生命周期在验证阶段后不正确地继续,而不会按照规范中止它。

  3. 另见:

    回到具体的功能要求。

    1. 对于非宽松的日期转换,只需明确使用<f:convertDateTime>即可。如有必要,可以通过输入组件的converterMessage属性自定义转换器消息。

    2. 关于日期范围验证,请等到转换器完成后再抓取Date作为value,然后按Date#before()Date#after()进行比较。

    3. 所以,简而言之,这应该为你做到:

      private Date startDate;
      private Date endDate;
      
      <t:inputCalendar id="startDate" binding="#{startDateComponent}" value="#{bean.startDate}" 
          renderAsPopup="true" renderPopupButtonAsImage="true"
          popupDateFormat="dd.MM.yyyy" popupTodayDateFormat="dd.MM.yyyy"
          converterMessage="Please enter date in correct format"
      >
          <f:convertDateTime pattern="dd.MM.yyyy" />
      </t:inputCalendar>
      
      <t:inputCalendar id="endDate" value="#{bean.endDate}"
          renderAsPopup="true" renderPopupButtonAsImage="true"
          popupDateFormat="dd.MM.yyyy" popupTodayDateFormat="dd.MM.yyyy"
          converterMessage="Please enter date in correct format"
      >
          <f:convertDateTime pattern="dd.MM.yyyy" />
          <f:validator validatorId="dateRangeValidator" />
          <f:attribute name="startDateComponent" value="#{startDateComponent}" />
      </t:inputCalendar>
      

      其中dateRangeValidator是真实且可重复使用的@FacesValidator,可以在第2个&#34;中找到&#34;下方链接。请注意,第一个组件绑定到视图,绝对不是到bean,并且验证紧密耦合到辅助bean。

      另见: