2013-10-11 22 views
6

Ich versuche, zwei Composite-Components spielen gut zusammen durch Verschachtelung eines als Kind. Das Setup besteht aus einem Leuchtkasten und einer Eingabe mit einem Attribut namens "Value". Dies funktioniert gut, bis ich eine dynamische Anzahl von Eingängen einführen, und daher müssen Sie ein Ui: wiederholen.Composite Components mit Composite Children Vermischen Werte bei der Verwendung mit ui: wiederholen

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> 

Die ui: repeat scheint den Wert Attribut der beiden Komponenten gemischt und die folgende Ausnahme tritt zu erhalten.

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. Es scheint, wie der Wert der Leuchtkasten an die Eingänge übergeben wird.

  2. haben das Beispiel auf ein Minimum gekocht, um den Fehler zu erzeugen.

  3. Ich habe Mojarra 2.1.26 und 2.2.4 versucht.

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> 

Aktuelle Lösungen

  1. Umbenennung der Attributwert auf etwas anderes auf den Leuchtkasten behebt dieses Problem.

  2. Lassen Sie den Attributwert leer auf dem Leuchtkasten auch funktioniert.

  3. Nicht mit der UI: Wiederholung wird auch das Problem beheben, aber das ist nicht solide.

Derzeit bin ich mit zwei Attribute auf der Leuchtkasten und verlassen Sie den Wert leer benötigt, wenn

<h:outputText value="#{cc.attrs.value}#{cc.attrs.title}" /> 

Follow-up Unabhängig davon, was das Attribut Name ist, wenn sie die gleichen auf beiden Komponenten wird es fehlschlagen. Ist das ein Bug in JSF, habe ich die Bug Tracker und die meisten neuen Patch Notes ohne Ergebnis durchsucht.

+2

+1 für die Bereitstellung einer gut erklärt und klar SSCCE. Gut gemacht für deine erste Frage! –

Antwort

0

Haben Sie versucht, <c:forEach> Tag unter JSTL statt <ui:repeat> zu verwenden? Ich habe immer Probleme mit dem <ui:repeat> Tag.

<c:forEach> sollte funktionieren, wenn Sie die Komponente nicht erneut mit Ajax-Aufrufe rendern.