PrimeFaces日历接受无效的日期作为输入(PrimeFaces calendar accept

2019-07-04 17:28发布

我遇到的问题是与PrimesFaces 3.4.1日历。 当使用或者通过按钮或输入字段焦点激活弹出日期选择器,你只能选择其中做工精致,幸福的日子有效日期!

问题来当你手动添加日期到输入字段中,如果添加了无效的日期PrimeFaces日历组件采用了最好的猜测将其换算为一个有效的日期,然后将其发送,这意味着后端验证是一个没有去。 一些有趣的翻译如下:

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

要重新创建这种疯狂有一个看看PrimeFaces日历展示 。

我已经看到了解决方案,周围用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. 别的我都没有想到的!

由于提前,这已经引起了我的问题了几个星期!

Answer 1:

所述<p:calendar>下盖使用SimpleDateFormat这反过来默认使用宽松的解析,引起溢出的值翻转到下一日期度量水平。 例如,32月将成为2月1日,等等。

在普通的Java而言,这可以通过关闭DateFormat#setLenient()传递false 。 又见等等这样的问题: 使用日期格式验证日期 。

在JSF方面,你基本上需要提供使用非宽松的自定义转换DateFormat 。 幸运的是,标准的JSF已经在风味提供了这样一个开箱即用<f:convertDateTime>所以你可以只利用它直接。

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


Answer 2:

在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();
}


文章来源: PrimeFaces calendar accepts invalid dates as input