表单内Facet中的p:commandLink触发不在表单内的警告日志问题
问题:PrimeFaces commandLink在复合组件表单内仍提示未在表单中
我创建了一个包含表单和ul的复合组件,代码如下:
<h:form id="formid"> <ul> <composite:renderFacet name="listItems" /> </ul> </h:form>
使用该复合组件时,我通过facet传入了PrimeFaces的commandLink:
<my:comp id="componentId"> <f:facet name="listItems"> <li> <p:commandLink id="import-button" title="#{msg['import.title']}"> ....
但运行时日志出现警告:
Component 'componentId:import-button' should be inside a form or should reference a form via its form attribute. We will try to find a fallback form on the client side.
浏览器检查显示该按钮确实在表单DOM结构内,且原生h:commandLink能正常工作,但使用PrimeFaces的commandLink就会出警告,PrimeFaces版本为12.0.7。请问问题出在哪?
解答
这是PrimeFaces服务器端组件树校验逻辑,与JSF复合组件facet的渲染时机不匹配导致的:
- JSF复合组件的facet内容,是在复合组件渲染阶段才被插入到表单的DOM结构中;
- 但PrimeFaces的组件校验是在组件树构建阶段进行的,这时候
p:commandLink还没被纳入表单的组件树层级关联里,所以会误判它不在表单内。
解决方法很直接,给p:commandLink显式指定form属性,指向复合组件内表单的完整客户端ID:
<p:commandLink id="import-button" title="#{msg['import.title']}" form="#{cc.clientId}:formid">
这里#{cc.clientId}会获取当前复合组件的客户端ID(也就是示例中的componentId),拼接表单ID后就能让PrimeFaces正确识别表单关联,警告就会消失。
内容的提问来源于stack exchange,提问作者Tim Döring
相关产品推荐
相关产品推荐

