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

标签 java validation jsf primefaces calendar

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

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

  • 30/02/2012 变为 2/6/2014
  • 322/05/2012 变为 5/10/2038
  • 01/14/2012 变为 4/1/2012

要重现这种疯狂,请查看 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. 还有什么我没有想到的!

提前致谢,这让我困扰了数周!

最佳答案

<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>

关于java - PrimeFaces 日历接受无效日期作为输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13763717/

相关文章:

java - 如何使用准备好的语句的占位符来绑定(bind)表名的变量

java - 作为一个对 Java 有基本了解的学生,我可以转向 Android 吗?

java - 在 Play Framework 中使用 WHERE 子句返回 List<Type>

validation - 如何处理未在 HTML5 中验证的元元素?

javascript - 翻译 Api/后端错误消息以向用户显示

regex - 正则表达式验证字段 : field must contain atleast 2 AlphaNumeric characters

java - 查询数据存储时出现错误消息

jsf - 为什么我不能使用返回值 "success"从我的 managedBean 导航到另一个页面?

jsf - 如何重新渲染多个组件

jsf - 如何在 JSF 中以编程方式获取资源映射?