PrimeFaces p:calendar选中日期无法在Java后端获取求助
解决PrimeFaces p:calendar dateSelect事件event.getObject()返回null的问题
问题原因
你的XHTML代码存在语法错误:event="dateSelect" listener="#{assetDetail.creationDateChange}"没有正确包裹在PrimeFaces的ajax标签内,导致事件无法正确传递选中的日期对象——虽然事件方法能触发,但event.getObject()始终为null。
解决方案
方案1:直接使用p:calendar的dateSelectListener属性
修改XHTML代码,将监听器直接绑定到p:calendar的dateSelectListener属性上,无需额外ajax标签:
<p:calendar id="inputField_#{assetDetail.sanitizeId(field.name)}" value="#{assetDetail.dataFieldValuesMap[field.name]}" pattern="yyyy-MM-dd" styleClass="datafield-value" rendered="#{assetDetail.editMode}" dateSelectListener="#{assetDetail.creationDateChange}"/>
方案2:使用<p:ajax>标签包裹事件绑定
如果需要更灵活的ajax配置(比如添加update属性更新其他组件),将事件和监听器放在<p:ajax>标签内,作为p:calendar的子元素:
<p:calendar id="inputField_#{assetDetail.sanitizeId(field.name)}" value="#{assetDetail.dataFieldValuesMap[field.name]}" pattern="yyyy-MM-dd" styleClass="datafield-value" rendered="#{assetDetail.editMode}"> <p:ajax event="dateSelect" listener="#{assetDetail.creationDateChange}"/> </p:calendar>
额外验证点
- 确认后端
SelectEvent的导入正确:必须是org.primefaces.event.SelectEvent,而非JSF原生的javax.faces.event.SelectEvent(后者不支持dateSelect事件的对象传递)。 - 若上述方案仍有问题,可直接从绑定的value属性获取选中值:
注意:此方法需确保ajax请求已更新模型值,若使用方案2,可在public void creationDateChange() { Date selectedDate = (Date) dataFieldValuesMap.get("目标字段名"); if (selectedDate != null) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); System.out.println(sdf.format(selectedDate)); } else { System.out.println("选中日期为空"); } }<p:ajax>中添加process="@this"确保组件值被提交到后端。
内容的提问来源于stack exchange,提问作者Maria1995
相关产品推荐
相关产品推荐

