我遇到的问题是 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" />
解决方案方面,我愿意接受任何建议:
- 这是 PrimeFaces 中的常见问题吗?有没有我可以使用的技巧 修复它?
- 我可以在发送日期之前使用 JavaScript 验证日期吗? 完全阻止所有用户输入?
- 还有什么我没有想到的!
提前致谢,这让我困扰了数周!
最佳答案
<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/