2013-10-11 14 views
6

Tôi đang cố gắng làm cho hai componenets phức hợp chơi tốt với nhau bằng cách lồng một cái như một đứa trẻ. Thiết lập bao gồm hộp đèn và đầu vào cả với thuộc tính được gọi là "Giá trị". Điều này hoạt động tốt, cho đến khi tôi giới thiệu số lượng đầu vào động và do đó phải sử dụng ui: lặp lại.Composite Components with Composite Children trộn các giá trị khi sử dụng với ui: lặp lại

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> 

Các ui: lặp lại dường như để có được những thuộc tính giá trị của hai thành phần hỗn hợp lên, và các ngoại lệ sau đây xảy ra.

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. Nó có vẻ như giá trị của hộp đèn đang được truyền cho các đầu vào.

  2. đã đun nhỏ ví dụ xuống mức tối thiểu để tạo lỗi.

  3. Tôi đã thử trên Mojarra 2.1.26 và 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> 

Giải pháp hiện tại

  1. Đổi tên giá trị thuộc tính đến cái gì khác trên các bản sửa lỗi lightbox vấn đề này.

  2. Rời bỏ giá trị thuộc tính trống trên hộp đèn cũng hoạt động.

  3. Không sử dụng giao diện người dùng: lặp lại cũng sẽ khắc phục sự cố, nhưng điều này không chắc chắn.

Hiện nay tôi đang sử dụng 2 thuộc tính trên hộp đèn và rời khỏi giá trị rỗng khi cần thiết

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

Theo dõi Bất kể những gì tên thuộc tính là, nếu họ đều giống nhau trên cả hai thành phần nó sẽ thất bại. Đây có phải là một lỗi trong JSF, tôi đã tìm kiếm các trình theo dõi lỗi và các ghi chú vá mới nhất mà không có kết quả.

+2

+1 để cung cấp SSCCE được giải thích rõ ràng và rõ ràng. Thực hiện tốt cho câu hỏi đầu tiên của bạn! –

Trả lời

0

Bạn đã thử sử dụng <c:forEach> thẻ dưới JSTL, thay vì <ui:repeat>? Tôi luôn gặp phải sự cố với thẻ <ui:repeat>.

<c:forEach> sẽ hoạt động nếu bạn không trả lại thành phần bằng cách sử dụng cuộc gọi ajax.

Các vấn đề liên quan