我正在使用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答案 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代码中为此做一些手动修复。