PrimeFaces10 p:datePicker设置min/maxdate出现类型转换或日期大小异常如何解决
问题原因
- 第一次
ClassCastException异常:你给mindate属性传入的是字符串字面量,maxdate传入的是LocalDate类型对象,PrimeFaces在校验日期范围时两边类型不匹配,无法将字符串强转为ChronoLocalDate导致报错。 - 第二次范围校验异常:你将
maxdate改为字符串类型后,日期字符串的格式与组件配置的pattern不匹配:组件pattern为MM/dd/yyyy要求月份、日期为两位,你生成的maxdate用的是M/d/uuuu格式会输出1位的月/日,同时写死的mindate="1/1/2011"也不符合MM/dd/yyyy格式要求,导致日期解析错误触发范围校验失败。
解决方案
方案1(推荐:类型安全,无需手动处理格式)
将mindate也改为LocalDate类型传入,全程使用日期对象交互,避免字符串解析风险:
首先修改工具Bean:
@Named @ApplicationScoped public class Dates { // 返回固定最小日期 public LocalDate getMinSupportedDate() { return LocalDate.of(2011, 1, 1); } // 返回当前日期加10年的最大日期 public LocalDate getMaxSupportedDate() { return LocalDate.now().plusYears(10); } }
调整组件配置:
<p:datePicker pattern="MM/dd/yyyy" mindate="#{dates.minSupportedDate}" maxdate="#{dates.maxSupportedDate}" .../>
方案2(兼容写死字符串mindate的场景)
严格保证mindate、maxdate的字符串格式和组件配置的pattern完全一致:
修改工具Bean的日期格式化模式:
@Named @ApplicationScoped public class Dates { public String getMaxSupportedDate() { // 格式化模式和组件的pattern保持一致 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM/dd/yyyy"); return LocalDate.now().plusYears(10).format(dtf); } }
调整组件的mindate为符合pattern的格式:
<p:datePicker pattern="MM/dd/yyyy" mindate="01/01/2011" maxdate="#{dates.maxSupportedDate}" .../>
内容的提问来源于stack exchange,提问作者PacificNW_Lover
相关产品推荐
相关产品推荐

