You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

额外验证点

  1. 确认后端SelectEvent的导入正确:必须是org.primefaces.event.SelectEvent,而非JSF原生的javax.faces.event.SelectEvent(后者不支持dateSelect事件的对象传递)。
  2. 若上述方案仍有问题,可直接从绑定的value属性获取选中值:
    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("选中日期为空");
        }
    }
    
    注意:此方法需确保ajax请求已更新模型值,若使用方案2,可在<p:ajax>中添加process="@this"确保组件值被提交到后端。

内容的提问来源于stack exchange,提问作者Maria1995

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 21:20:00