我遇到的问题是与PrimesFaces 3.4.1日历。 当使用或者通过按钮或输入字段焦点激活弹出日期选择器,你只能选择其中做工精致,幸福的日子有效日期!
问题来当你手动添加日期到输入字段中,如果添加了无效的日期PrimeFaces日历组件采用了最好的猜测将其换算为一个有效的日期,然后将其发送,这意味着后端验证是一个没有去。 一些有趣的翻译如下:
- 30/02/2012成为2014年2月6日
- 322/05/2012成为2038年5月10日
- 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" />
聪明的解决方案,我欢迎任何建议:
- 这是PrimeFaces一个共同的问题是什么? 有没有窍门,我可以用它来解决这个问题?
- 我可以使用JavaScript来验证之日起,在发出之前,或完全阻止所有用户输入?
- 别的我都没有想到的!
由于提前,这已经引起了我的问题了几个星期!
所述<p:calendar>
下盖使用SimpleDateFormat
这反过来默认使用宽松的解析,引起溢出的值翻转到下一日期度量水平。 例如,32月将成为2月1日,等等。
在普通的Java而言,这可以通过关闭DateFormat#setLenient()
传递false
。 又见等等这样的问题: 使用日期格式验证日期 。
在JSF方面,你基本上需要提供使用非宽松的自定义转换DateFormat
。 幸运的是,标准的JSF已经在风味提供了这样一个开箱即用<f:convertDateTime>
所以你可以只利用它直接。
<p:calendar ...>
<f:convertDateTime pattern="dd/MM/yyyy" />
</p:calendar>
在faces-config.xml中添加此
<converter>
<converter-id>localDateConverter</converter-id>
<converter-class>com.utility.LocalDateConverter</converter-class>
</converter>
另外,在上述类即LocaldateConverter添加此下面的代码
/**
* @param facesContext .
* @param uiComponent .
* @param input .
* @return Object .
*/
@Override
public Object getAsObject(final FacesContext facesContext, final UIComponent uiComponent, final String input) {
if (StringUtils.isBlank(input)) {
return null;
}
final String componentPattern = (String) uiComponent.getAttributes().get("datePattern");
final String patternToUse = componentPattern != null ? componentPattern : CommonConstants.OUTPUT_DATE_FORMAT;
try {
final DateFormat fmt = new SimpleDateFormat(patternToUse);
Date convertedDate = new java.sql.Date(fmt.parse(input).getTime());
return convertedDate;
} catch (Exception e) {
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Invalid Date Format", null));
}
}
/**
* @param facesContext .
* @param uiComponent .
* @param obj .
* @return String .
*/
@Override
public String getAsString(final FacesContext facesContext, final UIComponent uiComponent, final Object obj) {
if (obj==null) {
return null;
}
final Date date = (Date) obj;
return date.toString();
}