jsf - 当与 ui :repeat 一起使用时,带有复合子组件的复合组件会混淆值

标签 jsf jsf-2 facelets composite-component uirepeat

我试图通过在孩提时代嵌套一个组合来使两个复合组件一起玩得很好。
该设置由一个灯箱和一个输入组成,两者都具有一个名为“值”的属性。这很好用,直到我引入动态
输入的数量,因此必须使用 ui:repeat。

bugTest.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:pw="http://java.sun.com/jsf/composite/components">

    <h:head></h:head>
    <h:body>
        <pw:lightBox value="Header">
            <h:form>
                <ui:repeat var="input" value="#{BugTestBean.inputs}">
                    <pw:bugTestInput value="#{input}" />
                </ui:repeat>
            </h:form>
        </pw:lightBox>
    </h:body>
</html>

ui:repeat好像把两个组件的value属性搞混了,出现如下异常。
Caused by: javax.el.PropertyNotFoundException: /resources/components/bugTestInput.xhtml @15,62 value="#{cc.attrs.value.text}": The class 'java.lang.String' does not have the property 'text'.
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:111)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
at javax.faces.component.UIOutput.getValue(UIOutput.java:170)
at javax.faces.component.UIInput.getValue(UIInput.java:284)
at com.sun.faces.facelets.component.UIRepeat$SavedState.populate(UIRepeat.java:879)
at com.sun.faces.facelets.component.UIRepeat.saveChildState(UIRepeat.java:396)
at com.sun.faces.facelets.component.UIRepeat.saveChildState(UIRepeat.java:402)
at com.sun.faces.facelets.component.UIRepeat.saveChildState(UIRepeat.java:402)
at com.sun.faces.facelets.component.UIRepeat.saveChildState(UIRepeat.java:356)
at com.sun.faces.facelets.component.UIRepeat.setIndex(UIRepeat.java:470)
at com.sun.faces.facelets.component.UIRepeat.process(UIRepeat.java:586)
at com.sun.faces.facelets.component.UIRepeat.encodeChildren(UIRepeat.java:1042)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1819)
at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:847)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:304)
at com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:105)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:847)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:304)
at com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:105)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:847)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1819)
at com.sun.faces.renderkit.html_basic.CompositeRenderer.encodeChildren(CompositeRenderer.java:78)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:847)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1819)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1822)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1822)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:447)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
at com.ocpsoft.pretty.faces.application.PrettyViewHandler.renderView(PrettyViewHandler.java:159)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
... 33 more
  • 灯箱的值似乎正在传递给输入。
  • 已将示例简化为产生错误的最低限度。
  • 我试过 Mojarra 2.1.26 和 2.2.4。

  • BugTestBean.java
    @ManagedBean(name="BugTestBean")
    @ViewScoped
    public class BugTestBean {
        private List<BugTestInput> inputs;
    
        public BugTestBean() {
            inputs = new ArrayList<BugTestInput>();
            inputs.add(new BugTestInput("Test1"));
            inputs.add(new BugTestInput("Test2"));
            inputs.add(new BugTestInput("Test3"));
            inputs.add(new BugTestInput("Test4"));
        }
    
        public List<BugTestInput> getInputs() {
            return inputs;
        }
    }
    

    bugTestInput.xhtml
    <cc:interface>
        <cc:attribute name="value" />
    </cc:interface>
    <cc:implementation>
        <div id="#{cc.clientId}">
            <h:inputText id="input" value="#{cc.attrs.value.text}" />
        </div>
    </cc:implementation>
    

    BugTestInput.java
    public class BugTestInput {
        private String text;
    
        public BugTestInput(String text) {
            this.text = text;
        }
    
        public String getText() {
            return text;
        }
    
        public void setText(String text) {
            this.text = text;
        }
    }
    

    lightbox.xhtml
    <cc:interface>
        <cc:attribute name="value" />
    </cc:interface>
    <cc:implementation>
        <div id="#{cc.clientId}">
            <h:outputText value="#{cc.attrs.value}" />
            <h:panelGroup>
                <cc:insertChildren />
            </h:panelGroup>
        </div>
    </cc:implementation>
    

    当前解决方案
  • 将属性值重命名为灯箱上的其他值可解决此问题。
  • 将灯箱上的属性值留空也有效。
  • 不使用 ui:repeat 也可以解决问题,但这并不可靠。

  • 目前我在灯箱上使用 2 个属性,并在需要时将该值留空
    <h:outputText value="#{cc.attrs.value}#{cc.attrs.title}" />
    

    关注
    不管属性名称是什么,如果它们在两个组件上相同,它就会失败。
    这是 JSF 中的错误吗,我搜索了错误跟踪器和大多数新补丁说明,但没有结果。

    最佳答案

    您是否尝试过使用 <c:forEach>标签下 JSTL , 而不是 <ui:repeat> ?我一直面临着 <ui:repeat> 的问题标签。
    <c:forEach>如果您不使用 ajax 调用重新渲染组件,应该可以工作。

    关于jsf - 当与 ui :repeat 一起使用时,带有复合子组件的复合组件会混淆值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19319063/

    相关文章:

    jsf - 如何导航到托管bean中的另一个页面?

    java - 如何通过 servlet 将序列化对象从 Applet 提交到支持 bean,然后打开结果 JSF 页面

    java - Primefaces 键盘组件未在后端设置值

    java - Spring + JSF - 从数据库检索图像并在浏览器中显示

    jsf - 操作方法在 p :menuitem 中不起作用

    css - &lt;!--[if IE]> 条件注释在 Facelets 中呈现为 HTML 转义

    java - SelectOneRadio问题

    java - PrimeFaces 和浏览器兼容性

    java - 特立尼达 2.0 是否已被取代或废弃?

    java - 我可以在 Java Web 应用程序中使用 Servlet 来使用 Facelet 吗?