<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)を評価する前に内部dataTable(InnerItems)を評価しているようなものです。私の実際の仮定は、レンダリングされた属性が実際にどのように/いつ評価されるかを理解していないということです。