首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组合子组合组件在与ui一起使用时混合值:重复

组合子组合组件在与ui一起使用时混合值:重复
EN

Stack Overflow用户
提问于 2013-10-11 13:12:32
回答 1查看 1.2K关注 0票数 6

我试图使两个组合组件一起很好地一起嵌套一个孩子。安装程序由一个lightbox和一个输入组成,它们都带有一个名为"Value“的属性。这很好,直到我引入一个动态的输入数,因此必须使用ui:重复。

bugTest.xhtml

代码语言:javascript
复制
<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属性,并且出现了以下异常。

代码语言:javascript
复制
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
  1. 似乎灯箱的值正在传递给输入端。
  2. 将该示例简化到最小以产生错误。
  3. 我试过Mojarra 2.1.26和2.2.4。

BugTestBean.java

代码语言:javascript
复制
@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

代码语言:javascript
复制
<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

代码语言:javascript
复制
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

代码语言:javascript
复制
<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>

当前解决方案

  1. 将属性值重命名为lightbox上的其他值可以解决此问题。
  2. 将属性值保持为空在lightbox上也是有效的。
  3. 不使用ui:重复也会解决问题,但这并不可靠。

目前,我在lightbox上使用了两个属性,并在需要时将值保持为空。

代码语言:javascript
复制
<h:outputText value="#{cc.attrs.value}#{cc.attrs.title}" />

跟踪,不管属性名是什么,如果它们在两个组件上是相同的,那么它将失败。这是JSF中的一个bug,我搜索了bug跟踪器和大多数新的补丁注释,但没有结果。

EN

回答 1

Stack Overflow用户

发布于 2014-03-10 13:06:38

您是否尝试过在JSTL下使用<c:forEach>标记,而不是使用<ui:repeat>?我一直面临着<ui:repeat>标签的问题。

如果您不使用ajax调用重新呈现组件,<c:forEach>应该可以工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19319063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档