2013-10-11 5 views
6

Я стараюсь, чтобы два композитных компонента хорошо сочетались друг с другом, вставляя их в качестве ребенка. Настройка состоит из лайтбокса и ввода с атрибутом под названием «Значение». Это прекрасно работает, пока я не введу динамическое число входов, и поэтому вам придется использовать ui: repeat.Композитные компоненты с композитными детьми, смешивающие значения при использовании с 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> 

Пользовательский интерфейс: повтор, кажется, чтобы получить значение атрибута из двух компонентов, смешанных, и возникает следующее исключение.

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

@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. Не использовать ui: repeat также устранит проблему, но это не так.

В настоящее время я использую 2 атрибуты осветителя и оставить поле пустым, при необходимости

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

Последующие Независимо от того, что имя атрибута, если они одинаковы на обоих компонентов он не удастся. Является ли это ошибкой в ​​JSF, я искал следы ошибок и большинство новых патчей без результата.

+2

+1 для обеспечения хорошо объясненного и чистого SSCCE. Хорошо сделано для вашего первого вопроса! –

ответ

0

Вы пробовали использовать <c:forEach> тэг под JSTL, а не <ui:repeat>? Я всегда сталкивался с проблемами с тегом <ui:repeat>.

<c:forEach> должен работать, если вы не повторно визуализируете компонент с помощью вызовов ajax.

 Смежные вопросы

  • Нет связанных вопросов^_^