PrimeFaces日历接受无效日期作为输入

时间:2012-12-07 13:07:36

标签: java validation jsf primefaces calendar

我遇到的问题是PrimesFaces 3.4.1日历。当使用通过按钮或输入字段焦点激活的弹出日期选择器时,您只能选择工作正常,快乐的日子的有效日期!

当您在输入字段中手动添加日期时,如果添加无效日期,PrimeFaces日历组件会将其转换为有效日期然后发送它,这意味着后端验证是不行。下面有一些有趣的翻译:

  • 30/02/2012成为2014年2月6日
  • 322/05/2012成为5/10/2038
  • 01/14/2012成为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. 我还没有想到的任何其他事情!
  4. 在此先感谢,这已经导致我问题好几周了!

2 个答案:

答案 0 :(得分:13)

<p:calendar>使用了封面SimpleDateFormat,而lenient依次使用默认DateFormat#setLenient()解析,导致溢出的值转入下一个日期指标级别。例如。 1月32日将成为2月1日等。

在简单的Java术语中,validating a date using dateformat可以关闭此项,并传递false。另请参阅此问题:<f:convertDateTime>

在JSF术语中,您基本上需要提供一个使用非宽松DateFormat的自定义转换器。幸运的是,标准的JSF已经在{{3}}的风格中提供了这样一个,所以你可以直接使用它。

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

答案 1 :(得分: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();
}