Primefaces日历允许无效日期

时间:2012-06-15 06:55:38

标签: date calendar primefaces

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

参考: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>

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

谢谢&amp;此致

Tarun Madaan

3 个答案:

答案 0 :(得分:2)

我在primefaces日历上遇到了类似的问题。

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

无论如何,我最终在<f:validator>内设置<p:calendar>,如下所示:

<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));
        }
    }

我知道这可以防止1000以下的日期,但在我的情况下,绝对清楚日期​​不能低于2000.

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

否则,请尝试在primefaces论坛上提出这个问题。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

在输入数据时,可能无法弄清楚转换器中的内容 dd / mm / yyyy - 那么你的转换器会尝试将其转换为MM / yyyy。

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

然而,如果使用PF&lt; 4然后你会得到java脚本问题,因为p:calendar converter在验证后返回null对象有一个错误 - 你可以在重建它之后在PF代码中为此做一些手动修复。