【问题标题】:Primefaces calendar allows invalid datePrimefaces 日历允许无效日期
【发布时间】:2012-06-15 06:55:37
【问题描述】:

我正在使用 primefaces 日历,但我可以输入无效日期。例如在日期字段的输入框中输入日期为 32-06-2012 并保存记录。它将日期保存为 02-07-2012。在primefaces的展示中也可以观察到相同的行为。

参考:http://www.primefaces.org/showcase/ui/calendarBasic.jsf

这是我的代码

<p:calendar id="copyStartDateCalendar" pattern="dd/MM/yyyy"

         mode="popup" showOn="button" size='8' >

                <f:convertDateTime pattern="MM/yyyy" />

</p:calendar>

应该怎么做,因为组件本身似乎有一些错误。

感谢和问候

塔伦·马丹

【问题讨论】:

    标签: date calendar primefaces


    【解决方案1】:

    我在使用 primefaces 日历时遇到了类似的问题。

    虽然设置了pattern="dd.MM.yyyy" 模式,但它接受两位数的日期。就像20.06.12 将在日历弹出窗口中显示为20.06.2012 误导用户认为日期被正确识别。但实际上已经设定了第 12 年。

    无论如何,我最终在&lt;p:calendar&gt; 中设置了一个&lt;f:validator&gt;,如下所示:

    <p:calendar value="#{abschnittDView.bogen.pruefungsDatum}
        mode="popup" locale="de" pattern="dd.MM.yyyy" required="true"
        requiredMessage="Please provide a date."
        converterMessage="Date is invalid.">
    
        <f:convertDateTime type="date" pattern="dd.MM.yyyy" 
            timeZone="Europe/Berlin" locale="de" />
    
        <f:validator validatorId="de.common.DateValidator" />
    
    </p:calendar> 
    

    然后在给定日期做一些验证:

    @FacesValidator(DateValidator.VALIDATOR_ID)
    public class DateValidator implements Validator {
    
        public static final String VALIDATOR_ID = "de.common.DateValidator";
    
        @Override
        public void validate(FacesContext facesContext, UIComponent component, 
            Object value) throws ValidatorException {
    
            Date inputDate = (Date) value;
            Calendar cal = Calendar.getInstance();
            cal.setTime(inputDate);
            if (cal.get(Calendar.YEAR) < 1000) {
                throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Please provide a date with 4 digits for the year", null));
            }
        }
    

    我知道这可以防止日期低于 1​​000,但就我而言,绝对清楚日期​​不能低于 2000。

    所以建议是:使用Validator 确保日期正确。 我知道这不是完美的解决方案,但也许是一种可能的解决方法。

    否则,请尝试在 primefaces 论坛上询问。

    【讨论】:

    • 这是否适用于 PrimeFaces 问题,例如将“30/02/2012”等无效日期转换为“2/6/2014”,因为当它到达后端时,它已经已转换为有效日期?
    • 以上点的更多细节:stackoverflow.com/questions/13763717/…
    • 他的问题是“日”/“月”的 2 位数字翻转并将其映射到未来/过去的适当月份 - 这是由于 SimpleDateformat 具有宽大处理,使用转换器应该解决这个问题。 :)
    【解决方案2】:

    尝试在这种情况下使用readonly="true",您不需要使用任何服务器端验证器。此选项仅允许最终用户从日历面板中获取日期。

    【讨论】:

      【解决方案3】:

      您的模式和 f:convertDateTime 有不同的模式?

      在输入数据时,它可能无法确定您在转换器中想要什么 dd/mm/yyyy - 然后您的转换器尝试将其转换为 MM/yyyy。

      您描述的问题是因为侧 primfaces 中的简单日期格式化程序中的 leniency 设置为 true (它是默认操作)。强制是你然后使用你的 convertDatetime 应该修复它,但你的模式可能与它似乎不匹配。

      但是,如果使用 PF

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-22
        • 2012-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-24
        • 2013-02-22
        • 1970-01-01
        相关资源
        最近更新 更多