简体   繁体   English

JSF和Primefaces:组件ID无法找到

[英]JSF & Primefaces: Component ID just won't get found

I keep receiving the same exception again and again. 我一次又一次地收到同样的例外。 Comparing exception and hmtl-output without for="#{choiceRadio.clientId}" seems to tell me that binding works. 比较异常和没有for =“#{choiceRadio.clientId}的 hmtl-output 似乎告诉我绑定有效。 But it just doesn't and I feel like I am missing something huge. 但它只是没有,我觉得我错过了一些巨大的东西。

The Code: 编码:

    <p:selectOneRadio binding="#{choiceRadio}" value="#" layout="custom">
        <f:selectItems value="#" />
    </p:selectOneRadio>

    <h:panelGrid columns="1">
        <ui:repeat var='choice' value='#{item.items3}'>
            <p:radioButton for="#{choiceRadio.clientId}" />#{choice.name}
        </ui:repeat>
    </h:panelGrid>

</h:form>

The Exception: 例外情况:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Cannot find component 'j_idt34:0:j_idt36:2:j_idt46:j_idt82' in view.
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
    org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
root cause

javax.faces.FacesException: Cannot find component 'j_idt34:0:j_idt36:2:j_idt46:j_idt82' in view.
    org.primefaces.component.radiobutton.RadioButtonRenderer.findSelectOneRadio(RadioButtonRenderer.java:126)
    org.primefaces.component.radiobutton.RadioButtonRenderer.encodeEnd(RadioButtonRenderer.java:35)
    javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1786)
    com.sun.faces.facelets.component.RepeatRenderer.encodeChildren(RepeatRenderer.java:104)
    com.sun.faces.facelets.component.UIRepeat.process(UIRepeat.java:523)
    com.sun.faces.facelets.component.UIRepeat.encodeChildren(UIRepeat.java:984)
    com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:304)
    com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
    com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
    javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
    com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:304)
    com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:105)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
    com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:304)
    com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:105)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
    org.primefaces.component.lightbox.LightBoxRenderer.encodeMarkup(LightBoxRenderer.java:52)
    org.primefaces.component.lightbox.LightBoxRenderer.encodeEnd(LightBoxRenderer.java:32)
    javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
    org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:59)
    org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:43)
    org.primefaces.component.outputpanel.OutputPanelRenderer.encodeEnd(OutputPanelRenderer.java:46)
    javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1786)
    com.sun.faces.facelets.component.RepeatRenderer.encodeChildren(RepeatRenderer.java:104)
    com.sun.faces.facelets.component.UIRepeat.process(UIRepeat.java:523)
    com.sun.faces.facelets.component.UIRepeat.encodeChildren(UIRepeat.java:984)
    com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:304)
    com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:105)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
    org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:55)
    org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:43)
    org.primefaces.component.outputpanel.OutputPanelRenderer.encodeEnd(OutputPanelRenderer.java:46)
    javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1786)
    com.sun.faces.facelets.component.RepeatRenderer.encodeChildren(RepeatRenderer.java:104)
    com.sun.faces.facelets.component.UIRepeat.process(UIRepeat.java:523)
    com.sun.faces.facelets.component.UIRepeat.encodeChildren(UIRepeat.java:984)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
    javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
    org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
note The full stack trace of the root cause is available in the JBoss Web/7.0.13.Final logs.

JBoss Web/7.0.13.Final

Without ui:repeat I don't get any exception but without ui:repeat I do not have any content either: 没有ui:重复我没有任何异常,但没有ui:重复我也没有任何内容:

    <p:selectOneRadio  id="myRadio" value="#{cartBean.selectedChoice}" layout="custom">
        <f:selectItems value="#{item.items3}" />
    </p:selectOneRadio>

    <h:panelGrid columns="1">

            <p:radioButton for="myRadio" value="hh" itemIndex="0"/>

    </h:panelGrid>

</h:form>

The for attribute of the radioButton must be the id of the selectOneRadio it refers to. radioButtonfor属性必须是它引用的selectOneRadioid

Add an id to your selectOneRadio and refer to it in the button: selectOneRadio添加一个id并在按钮中引用它:

<p:selectOneRadio id="myRadio" binding="#{choiceRadio}" value="#" layout="custom">
    <f:selectItems value="#" />
</p:selectOneRadio>

<h:panelGrid columns="1">
    <ui:repeat var='choice' value='#{item.items3}'>
        <p:radioButton for="myRadio" />#{choice.name}
    </ui:repeat>
</h:panelGrid>

EDIT 编辑

You might need to prepend the ids of all NamingContainer s right from ViewRoot before the element id , like: for="form_id:myRadio" . 您可能需要在元素id之前从ViewRoot预先添加所有NamingContainerid ,例如: for="form_id:myRadio"

When in doubt what the exact absolute id of an element might be, look at it in FireBug (Firefox) or developer tools (Chrome) or search for its given id (in this case "myRadio") in the html output source and skip possible numbers in-between. 如果怀疑元素的确切绝对id是什么,请在FireBug(Firefox)或开发人员工具(Chrome)中查看它,或在html输出源中搜索其给定的id (在本例中为“myRadio”)并跳过可能的中间的数字。

So this 所以这

id="iterateCategories:0:iterateItems:2:lightForm:radioForm"

would become 会成为

iterateCategories:iterateItems:lightForm:radioForm

as your absolute id. 作为你的绝对身份。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM