4

我正在使用 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>

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

感谢和问候

塔伦·马丹

4

3 回答 3

2

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

于 2012-12-22T14:45:47.340 回答
2

I had similar problems with the primefaces calendar.

For one it accepts dates with two digits though a pattern of pattern="dd.MM.yyyy" is set. Like 20.06.12 will be shown in the calendar popup as 20.06.2012 misleading the user to think the date was correctly recognized. But the year 12 is actually set.

Anyways, I ended up setting a <f:validator> inside the <p:calendar> like this:

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

Then doing some validation on the given date:

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

I know this prevents dates below 1000 but in my case it is absolutely clear that the date can not be lower then 2000.

So the suggestion is: Use a Validator to make sure the dates are correct. I know it is not the perfect solution but maybe a possible workaround.

Otherwise, try to ask for this on the primefaces forum.

于 2012-06-20T09:47:21.123 回答
0

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

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

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

但是,如果使用 PF < 4 的版本,您将遇到 java 脚本问题,因为 p:calendar 转换器在验证后返回空对象时存在错误 - 您可以在重建 PF 代码后对此进行一些手动修复。

于 2014-03-18T12:48:53.677 回答