PrimeFaces 7升级至8后Schedule组件无法显示事件问题
升级PrimeFaces从7版本到8版本后,Schedule组件无法正常显示事件,升级前该功能运行完全正常。对应的xhtml代码如下:
<p:panel style="margin-right: 3px;margin-bottom: 3px" rendered="#{dashboardBean.renderedAjandam}" closable="true" toggleable="true" id="ajandam" header="Ajandam" resize="true" autosize="true" scrollable="true"> <h:form> <p:scrollPanel mode="native" style="border: hidden;height:375px" columnClasses="value"> <p:schedule id="schedule" value="#{hatirlaticiBean.eventModel}" locale="tr" timeZone="GMT+3"> <p:ajax event="dateSelect" listener="#{hatirlaticiBean.onDateSelect}" update=":frmeventDialog:eventDetails" oncomplete="PF('eventDialog').show();" /> <p:ajax event="eventSelect" listener="#{hatirlaticiBean.onEventSelect}" update=":frmeventDialog:eventDetails" oncomplete="PF('eventDialog').show();" /> <p:ajax event="eventMove" listener="#{hatirlaticiBean.onEventMove}" update=":frmLytCenter:messages" /> <p:ajax event="eventResize" listener="#{hatirlaticiBean.onEventResize}" update=":frmLytCenter:messages" /> </p:schedule> </p:scrollPanel> </h:form> <p:ajax event="close" listener="#{dashboardBean.onClose}" update=":frmLytCenter,messages" /> </p:panel>
针对这个问题,你可以从以下几个方向排查解决:
检查事件模型的属性规范:PrimeFaces 8的Schedule底层替换为FullCalendar 4,对事件对象的属性要求更严格。确保你的
eventModel中的每个事件:- 开始时间属性为
start(旧版本允许的startDate不再兼容) - 结束时间属性为
end(旧版本的endDate需改为end) - 全天事件必须显式设置
allDay为布尔值(注意大小写,不能是字符串)
- 开始时间属性为
验证时区配置:将
timeZone属性值替换为标准时区ID,比如Europe/Istanbul而非GMT+3。同时确认后台生成事件日期时,已正确转换到指定时区,避免因时区偏移导致事件被渲染到不可见的时间段。确认本地化资源加载:土耳其语(
tr)的FullCalendar本地化资源需正确加载。检查项目中是否包含fullcalendar-locale-tr.js,并确保页面能正确引入该文件(PrimeFaces可能不会自动加载所有locale资源)。移除嵌套的scrollPanel:尝试把Schedule组件直接放在
h:form内,去掉外层的p:scrollPanel。PrimeFaces 8的Schedule尺寸计算逻辑可能和scrollPanel存在冲突,导致事件区域渲染异常。排查Bean作用域与数据更新:确保
hatirlaticiBean使用@ViewScoped作用域,避免每次请求都重新创建事件模型。同时检查AJAX操作后,eventModel是否能正确返回最新的事件数据。查看浏览器控制台错误:打开浏览器开发者工具的Console面板,查看是否有FullCalendar初始化失败、资源加载错误等JS异常,这些通常是组件无法显示事件的直接原因。
内容的提问来源于stack exchange,提问作者Cagatayyy

