<h:dataTable cellpadding="0" cellspacing="0"
styleClass="list_table" id="OuterItems"
value="#{valueList.values}" var="item" border="0">
<h:column rendered="#{item.typeA}">
<h:dataTable cellpadding="0" cellspacing="0"
styleClass="list_table" id="InnerItems"
value="#{item.options}" var="option" border="0">
<h:column >
<h:outputText value="Option: #{option.displayValue}"/>
</h:column>
</h:dataTable>
</h:column>
<h:column rendered="#{item.typeB}">
<h:dataTable cellpadding="0" cellspacing="0"
styleClass="list_table" id="InnerItems"
value="#{item.demands}" var="demand" border="0">
<h:column >
<h:outputText value="Demand: #{demand.displayValue}"/>
</h:column>
</h:dataTable>
</h:column>
</h:dataTable>
public class Item{
...
public boolean isTypeA(){
return this instanceof TypeA;
}
public boolean isTypeB(){
return this instanceof TypeB;
}
...
}
public class typeA extends Item(){
...
public List getOptions(){
....
}
...
}
public class typeB extends Item(){
...
public List getDemands(){
...
}
....
}
У меня проблема с JSF. Я изложил эту проблему здесь и надеюсь, что кто-нибудь может помочь мне понять, почему мои действия терпят неудачу. Я перебираю список предметов. Эти Предметы на самом деле являются экземплярами подклассов TypeA и TypeB. Для типа A я хочу отобразить параметры, для типа B я хочу отобразить требования. При рендеринге страницы в первый раз это работает нормально. Однако, когда я возвращаюсь на страницу для какого-либо действия, я получаю сообщение об ошибке:
[3/26/10 12:52:32:781 EST] 0000008c SystemErr R javax.faces.FacesException: Error getting property 'options' from bean of type TypeB
at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:89)
at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java(Compiled Code))
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:91)
at com.ibm.faces.portlet.FacesPortlet.processAction(FacesPortlet.java:193)
Мое понимание жизненного цикла JSF очень грубое. На данный момент я понимаю, что в фазах ApplyRequestValues произошла ошибка, которая очень ранняя, поэтому предыдущее состояние восстанавливается и ничего не меняется.
Чего я не понимаю, так это того, что для выполнения условия рендеринга "item.typeA" этот объект должен быть экземпляром TypeA. Но здесь, похоже, что объект прошел условие, хотя это был экземпляр TypeB. Это похоже на оценку внутренней dataTable (InnerItems) перед оценкой внешней (externalItems). Мое рабочее предположение состоит в том, что я просто не понимаю, как / когда фактически отображается визуализированный атрибут.