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

Jon*_*ing 8 java validation jsf calendar primefaces

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

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

  • 30/02/2012成为2/6/2014
  • 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" />
Run Code Online (Sandbox Code Playgroud)

解决方案明智我对任何建议持开放态度:

  1. 这是PrimeFaces中的常见问题吗?有没有我可以用来解决它的技巧?
  2. 我可以使用JavaScript在发送之前验证日期还是完全阻止所有用户输入?
  3. 还有什么别的我没有想到的!

在此先感谢,这已经引起了我好几周的问题!

Bal*_*usC 14

<p:calendar>封面下使用SimpleDateFormat这反过来默认使用宽松的解析,导致溢出值,以滚动到下一个日期度量水平.例如,1月32日将成为2月1日等.

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

在JSF术语中,您基本上需要提供一个使用非宽松的自定义转换器DateFormat.幸运的是,标准的JSF已经提供了这样一个开箱即用的方法<f:convertDateTime>,所以你可以直接使用它.

<p:calendar ...>
    <f:convertDateTime pattern="dd/MM/yyyy" />
</p:calendar>
Run Code Online (Sandbox Code Playgroud)