Domanda

<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(){
        ...
    }
    ....
}

Sto riscontrando un problema con JSF.Ho astratto il problema qui e spero che qualcuno possa aiutarmi a capire come ciò che sto facendo fallisce.Sto scorrendo un elenco di elementi.Questi elementi sono in realtà istanze delle sottoclassi TypeA e TypeB.Per il Tipo A voglio visualizzare le opzioni, per il Tipo B voglio visualizzare le richieste.Quando si esegue il rendering della pagina per la prima volta, funziona correttamente.Tuttavia, quando pubblico di nuovo sulla pagina per eseguire un'azione, ricevo un errore:

[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)

La mia conoscenza del ciclo di vita di JSF è molto approssimativa.A questo punto, capisco che c'è un errore nelle fasi ApplyRequestValues ​​che è molto precoce e quindi lo stato precedente viene ripristinato e non cambia nulla.

Quello che non capisco è che per soddisfare la condizione per il rendering di "item.typeA" quell'oggetto deve essere un'istanza di TypeA.Ma qui sembra che l'oggetto abbia superato la condizione anche se era un'istanza di TypeB.È come se stesse valutando la dataTable interna (InnerItems) prima di valutare quella esterna (outerItems).Il mio presupposto di lavoro è che semplicemente non capisco come/quando l'attributo reso viene effettivamente valutato.

È stato utile?

Soluzione

 <h:column rendered="#{item.typeA}">
        <h:dataTable cellpadding="0" cellspacing="0"
        styleClass="list_table" id="InnerItems"
        value="#{item.options}" var="option" border="0"
        rendered="#{item.typeA}"> <!--  THIS IS THE CHANGE -->
            <h:column >
                <h:outputText value="Option: #{option.displayValue}"/>
            </h:column>
        </h:dataTable>
    </h:column>

In qualche modo l'aggiunta della condizione renderizzata direttamente al datatable non mi è venuta in mente durante le mie molte ore di iterazione di ipotesi/caccia alle uova (ero davvero disperato).Ancora non capisco perché non abbia funzionato in primo luogo, ma funziona.

Altri suggerimenti

Lo so, il post è vecchio ma...se ti stai ancora chiedendo perché non funzionava nel tuo primo snippet, probabilmente è perché ti manca la parentesi graffa di chiusura:

<h:column rendered="#{item.typeA">
<h:column rendered="#{item.typeB">

Questo è stato impostato correttamente quando hai inserito la condizione di rendering sul datatable.

rendered="#{item.typeA}"> <!--  THIS IS THE CHANGE -->
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top