2013-10-11 5 views
6

दोहराएं मैं दो समग्र componenets को एक बच्चे के रूप में घोंसले से अच्छी तरह से खेलने की कोशिश कर रहा हूं। सेटअप में "लाइटबॉक्स" नामक एक विशेषता के साथ एक लाइटबॉक्स और इनपुट दोनों शामिल हैं। यह ठीक काम करता है, जब तक कि मैं एक गतिशील इनपुट की संख्या प्रस्तुत नहीं करता, और इसलिए एक ui: दोहराना उपयोग करना है।मिश्रित बच्चों के साथ समग्र घटक ui के साथ उपयोग किए जाने वाले मानों को मिलाते हुए:

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: दोहराने दो घटकों को मिलाया का मूल्य विशेषता प्राप्त करने के लिए लगता है, और निम्न अपवाद तब होता है।

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. मैंने मोजररा 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> 

वर्तमान समाधान

  1. लाइटबॉक्स समाधानों का लाभ नहीं कुछ और ही इस समस्या का विशेषता मान का नाम बदल रहा।

  2. लाइटबॉक्स पर खाली विशेषता मान छोड़कर भी काम करता है।

  3. यूई का उपयोग नहीं करना: दोहराना समस्या को भी ठीक करेगा, लेकिन यह ठोस नहीं है।

वर्तमान में

मैं लाइटबॉक्स पर 2 विशेषताओं का उपयोग कर रहा हूँ और जब जरूरत

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

क्या विशेषता नाम है की परवाह किए बिना अनुवर्ती मान रिक्त छोड़ रहा है, अगर वे दोनों पर ही कर रहे हैं घटकों में यह असफल हो जाएगा। क्या यह जेएसएफ में एक बग है, मैंने बिना बग ट्रैकर्स और सबसे नए पैच नोट्स खोजे हैं।

+2

+1 एक अच्छी तरह से समझाया और स्पष्ट एसएससीसीई प्रदान करने के लिए +1। अपने पहले सवाल के लिए अच्छा किया! –

उत्तर

0

क्या आपने टैग JSTL के तहत <ui:repeat> के बजाय उपयोग करने का प्रयास किया है? मुझे हमेशा <ui:repeat> टैग के साथ समस्याएं आ रही हैं।

<c:forEach> काम करना चाहिए यदि आप AJAX कॉल का उपयोग करके घटक को पुनः प्रस्तुत नहीं करते हैं।

संबंधित मुद्दे