<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 类,我要显示选项,对于 BI 类,我要显示需求。第一次渲染页面时,这工作正常。但是,当我发回页面以执行某些操作时,出现错误:
[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 的实例。就像在评估外部(outerItems)之前评估内部数据表(InnerItems)一样。我的工作假设是,我只是不了解实际评估渲染属性的方式/时间。