8

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

当您手动将日期添加到输入字段时,问题就出现了,如果您添加无效日期,PrimeFaces 日历组件会尽力将其转换为有效日期然后发送,这意味着后端验证是不行的. 下面是一些有趣的翻译:

  • 2012 年 2 月 30 日变为 2014 年 2 月 6 日
  • 322/05/2012 变为 5/10/2038
  • 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. 还有什么我没想到的!

在此先感谢,这已经给我带来了几个星期的问题!

4

2 回答 2

14

默认情况下使用宽松解析的幕后用途,导致<p:calendar>溢出的值滚动到下一个日期度量级别。例如,1 月 32 日将变为 2 月 1 日,等等。SimpleDateFormat

DateFormat#setLenient()用简单的 Java 术语来说,这可以通过传递来关闭false。另请参阅此问题:使用 dateformat 验证日期

在 JSF 术语中,您基本上需要提供一个使用 non-lenient 的自定义转换器DateFormat。幸运的是,标准 JSF 已经以<f:convertDateTime>.

<p:calendar ...>
    <f:convertDateTime pattern="dd/MM/yyyy" />
</p:calendar>
于 2012-12-07T16:12:17.107 回答
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();
}
于 2014-01-24T13:34:18.187 回答