PrimeFaces日历接受无效日期作为输入

我遇到的问题是PrimesFaces 3.4.1日历。 当使用通过按钮或输入字段焦点激活的弹出日期选择器时,您只能选择工作正常,快乐的日子的有效日期!

当您手动将日期添加到输入字段时,如果您添加一个无效的日期,PrimeFaces日历组件将其转换为有效日期然后发送它,这意味着后端validation是不行的。 以下一些有趣的翻译:

  • 30/02/2012成为2/6/2014
  • 322/05/2012成为5/10/2038
  • 2012年1月14日成为2012年4月1日

要重现这种疯狂,请看看PrimeFaces日历展示 。

我已经看到使用readOnlyInput='true'属性的解决方案,但这似乎只是防止在字段中输入字母而不是数字或斜杠。 以下是我实施的日历的一个实例:

 

解决方案明智我对任何建议持开放态度:

  1. 这是PrimeFaces中的常见问题吗? 有没有我可以用来解决它的技巧?
  2. 我可以使用JavaScript在发送之前validation日期还是完全阻止所有用户输入?
  3. 还有别的我还没有想到的!

在此先感谢,这已经引起了我好几周的问题!

使用了SimpleDateFormat ,它默认使用默认的宽松解析,导致溢出的值转入下一个日期度量级别。 例如,1月32日将成为2月1日等。

用简单的Java术语来说,这可以通过DateFormat#setLenient()关闭,传递false 。 另请参阅此问题: 使用dateformatvalidation日期 。

在JSF术语中,您基本上需要提供一个使用非宽松DateFormat的自定义转换器。 幸运的是,标准JSF已经在风格中提供了这样一个开箱即用,所以你可以直接使用它。

    

在faces-config.xml中添加此项

  localDateConverter com.utility.LocalDateConverter  

在上面的类ie 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(); }