2012-12-07 80 views
8

我遇到的問題是與PrimesFaces 3.4.1日曆。當使用通過按鈕或輸入區域焦點激活的彈出日期選擇器時,您只能選擇工作正常,有效的日期!PrimeFaces日曆接受無效的日期作爲輸入

當您手動添加日期到輸入字段時,如果添加無效日期,PrimeFaces日曆組件將其轉換爲有效日期並將其發送出去,然後將其發送出去,這意味着後端驗證是不行的。下面的一些有趣的翻譯:

  • 30/02/2012成爲2014年2月6日
  • 322/05/2012成爲2038年5月10日
  • 2012年1月14日成爲2012/4/1

要重新創建這個瘋狂看看PrimeFaces Calendar Showcase

我已經看到使用readOnlyInput='true'屬性的解決方案,但似乎只能防止在字段中輸入的字母不是數字或斜線。下面是日曆的一個實例我已經實現:

<p:calendar id="fldDateOfBirth" 
      value="#{pc_CreateUser.user.dateOfBirth}" 
      binding="#{pc_CreateUser.dobComp}" 
      navigator="true" 
      pattern="dd/MM/yyyy" 
      maxlength="10" 
      yearRange="-100" 
      validator="#{pc_CreateUser.validateDOB}" 
      title="#{msg.user_date_format_default_tip}" 
      converterMessage="#{msg.user_error_dob_invalid}" 
      readOnlyInput="true" 
      showOn="button" /> 

明智的解決方案,我願意接受任何建議:

  1. 這是在PrimeFaces一個共同的問題是什麼?是否有我可以用來修復 的技巧?
  2. 我可以使用JavaScript驗證發送之前的日期,或者是否完全禁止所有用戶輸入?
  3. 還有什麼我沒有想到的!

在此先感謝,這已經導致我幾個星期的問題!

回答

13

<p:calendar>在封面SimpleDateFormat下使用,而後者又默認使用lenient解析,導致溢出的值翻轉到下一個日期度量標準級別。例如。 1月32日將成爲2月1日等。

用普通的Java術語,這可以關閉DateFormat#setLenient(),通過false。另請參閱此問題:validating a date using dateformat

在JSF中,您基本上需要提供一個使用非寬鬆DateFormat的自定義轉換器。幸運的是,標準的JSF已經在<f:convertDateTime>的風格中提供了這樣一個盒子,所以你可以直接使用它。

<p:calendar ...> 
    <f:convertDateTime pattern="dd/MM/yyyy" /> 
</p:calendar> 
+0

這工作一種享受!感謝您的解決方案和您的解釋,非常感謝。 – JonnyIrving

+0

不客氣。 – BalusC

+0

如果使用舊版本的primefaces使用此convertDateTime會導致轉換返回null,並且您將收到javascript錯誤。 (getDate == null)。如果你可以升級到PF 4,那麼很不幸,我不能和正在尋找替代品:) – VeenarM

0

faces-config.xml中添加此

<converter> 
    <converter-id>localDateConverter</converter-id> 
    <converter-class>com.utility.LocalDateConverter</converter-class> 
</converter> 

在上面的類即LocaldateConverter添加此下面的代碼

/** 
* @param facesContext . 
* @param uiComponent . 
* @param input . 
* @return Object . 
*/ 
@Override 
public Object getAsObject(final FacesContext facesContext, final UIComponent uiComponent, final String input) { 
    if (StringUtils.isBlank(input)) { 
     return null; 
    } 
    final String componentPattern = (String) uiComponent.getAttributes().get("datePattern"); 
    final String patternToUse = componentPattern != null ? componentPattern : CommonConstants.OUTPUT_DATE_FORMAT; 
    try { 
     final DateFormat fmt = new SimpleDateFormat(patternToUse); 
     Date convertedDate = new java.sql.Date(fmt.parse(input).getTime()); 
     return convertedDate; 
    } catch (Exception e) { 
     throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Invalid Date Format", null)); 
    } 
} 

/** 
* @param facesContext . 
* @param uiComponent . 
* @param obj . 
* @return String . 
*/ 
@Override 
public String getAsString(final FacesContext facesContext, final UIComponent uiComponent, final Object obj) { 
    if (obj==null) { 
     return null; 
    } 
    final Date date = (Date) obj; 
    return date.toString(); 
} 
+0

這對您有幫助嗎?你甚至不會告訴他們你在做什麼。你所做的只是複製當前已經是標準的jsf datetime轉換器。 – VeenarM

相關問題