【发布时间】:2017-10-23 09:28:34
【问题描述】:
在某些情况下,我收到“java.lang.IllegalStateException:组件 ID 已在视图中找到”异常,我不明白为什么。
我有以下页面,其中我使用了四次复合组件,并且有一个相应的输出文本用于显示每次的结果:
<h:form id="aCrazyTestForm"">
<my:jqueryautocomplete values="#{jqueryAutoCompleteBean.carListJson}" selectedValue="#{jqueryAutoCompleteBean.selectedCarOne}" field="make">
<f:ajax execute=":aCrazyTestForm:completeOne" render=":aCrazyTestForm:completeOne" event="tagSelectedEvent" listener="#{jqueryAutoCompleteBean.selectedCarOne}" />
</my:jqueryautocomplete>
<h:outputText id="completeOne" value="#{jqueryAutoCompleteBean.selectedCarOne}" />
<my:jqueryautocomplete values="#{jqueryAutoCompleteBean.carListJson}" selectedValue="#{jqueryAutoCompleteBean.selectedCarTwo}" field="make">
<f:ajax execute=":aCrazyTestForm:completeTwo" render=":aCrazyTestForm:completeTwo" event="tagSelectedEvent" listener="#{jqueryAutoCompleteBean.selectedCarTwo}" />
</my:jqueryautocomplete>
<h:outputText id="completeTwo" value="#{jqueryAutoCompleteBean.selectedCarTwo}" />
<my:jqueryautocomplete values="#{jqueryAutoCompleteBean.carListJson}" selectedValue="#{jqueryAutoCompleteBean.selectedCarThree}" field="make">
<f:ajax execute=":aCrazyTestForm:completeThree" render=":aCrazyTestForm:completeThree" event="tagSelectedEvent" listener="#{jqueryAutoCompleteBean.selectedCarThree}" />
</my:jqueryautocomplete>
<h:outputText id="completeThree" value="#{jqueryAutoCompleteBean.selectedCarThree}" />
<my:jqueryautocomplete values="#{jqueryAutoCompleteBean.carListJson}" selectedValue="#{jqueryAutoCompleteBean.selectedCarFour}" field="make">
<f:ajax execute=":aCrazyTestForm:completeFour" render=":aCrazyTestForm:completeFour" event="tagSelectedEvent" listener="#{jqueryAutoCompleteBean.selectedCarFour}" />
</my:jqueryautocomplete>
<h:outputText id="completeFour" value="#{jqueryAutoCompleteBean.selectedCarFour}" />
</h:form>
我的复合组件实现包装在一个 id = "#{cc.clientId}" 的 span 中
如果我填充表单的 id,我只会遇到此错误。如果我设置表单 prependId="false",那么我不会收到错误。
使用下面的代码,我得到了错误: “未处理的面孔错误:组件 ID aCrazyTestForm:j_idt15 已在视图中找到”。在下面的sn-p中可以看到这其实是我自定义组件的id。
<JqueryAutoComplete id="j_idt15" immediate="false" inView="true" localValueSet="false" rendered="true" required="false" transient="false" valid="true">
我认为使用 id="#{cc.clientId}" 将复合组件的实现包装在一个跨度中可以确保我的组件在任何地方使用它都能获得唯一的标识符?
【问题讨论】:
-
查看生成的页面源码。哪些和哪些 id 崩溃了?
-
出现错误时看不到生成的源页面...你看到错误页面的HTML
-
为什么要设置生成的ID呢?要么使用自定义的,要么让 JSF 生成它。
-
这只是一个猜测,但我认为 JSF 中有一个服务器端 DOM,其中包括您的复合组件,并且有 (X)HTML 形式的客户端 DOM。您尝试在 CC 内的跨度上设置的 clientID 可能与其父级相同。您可以通过设置
id=#{cc.clientId}_foo然后查看生成的 HTML 轻松检查。
标签: java jsf composite-component