Come Mappa di accesso chiave in jsf datatable

Ricevo l’errore javax.el.PropertyNotFoundException: /member/apps/cms/edit.xhtml @228,49 value="#{props.key}": Property 'key' not found on type java.util.HashMap$Values quando si tenta di visualizzare il datatable di seguito.

<p:dataTable id="properties" var="props" value="#{contentEditorBacking.properties}" editable="true">

    <p:column headerText="Property">
        <p:cellEditor>
            <f:facet name="output"> 
                <h:outputText value="#{props.key}" />
            </f:facet>
            <f:facet name="input">
                <h:inputText value="#{props.key}" />
            </f:facet>
        </p:cellEditor>
    </p:column>
    <p:column headerText="Value">
        <p:cellEditor>
                        <f:facet name="output"> 
                <h:outputText value="#{props.value}" />
            </f:facet>
            <f:facet name="input">
                <h:inputText value="#{props.value}" />
            </f:facet>
        </p:cellEditor>
    </p:column>

    <p:column headerText="Edit">
        <p:rowEditor />
        <!-- Need to put an update on here yet -->
        <p:commandLink styleClass="ui-icon ui-icon-trash" id="deleteProperty" actionListener="#{contentEditorBacking.deleteProperty}">
                 <f:attribute name="key" value="#{props.key}" />
             </p:commandLink>
    </p:column>
</p:dataTable>

Qui è la parte più importante della mia contentEditorBacking:

@ManagedBean
@ViewScoped
public class ContentEditorBacking {
    private Map<String, Properties> properties = new LinkedHashMap<String, Properties>();

    public Collection<Properties> getProperties() throws Exception{
        return properties.values();
    }

    public static class Properties{

        private String key;
        private String value;

        public Properties(String key, String value) {
            super();
            this.key = key;
            this.value = value;
        }

        public String getKey() {
            return key;
        }
        public void setKey(String key) {
            this.key = key;
        }
        public String getValue() {
            return value;
        }
        public void setValue(String value) {
            this.value = value;
        }
        @Override
        public String toString() {
            return "key=" + key + ", value=" + value + "";
        }

    }
}

Come posso accedere al valore della chiave di mia proprietà sulla mappa?

post di una parte più grande del tuo file XHTML.
Spiacente, la datatable tag ha tagliato fuori. C’è ora.

OriginaleL’autore Catfish | 2012-07-18

4 risposte

  1. 6

    Fino alla prossima JSF 2.2, il <h:dataTable>/<p:dataTable> non supporta Collection<E>. Non solo sostiene, tra l’altro List<E>.

    È necessario sostituire

    public Collection<Properties> getProperties() throws Exception{
        return properties.values();
    }

    da

    private List<Properties> propertiesAsList;
    
    public List<Properties> getProperties() throws Exception{
        return propertiesAsList;
    }

    e da qualche parte direttamente dopo la mappa di inizializzazione di fare questo

    propertiesAsList = new ArrayList<Properties>(properties.values());

    (nota: non fare all’interno del getter!)

    OriginaleL’autore BalusC

  2. 2

    Nel codice JSF, si sta tentando di accedere alla chiave di proprietà della cosa restituito da getProperties() il metodo, che è l’intera collezione. È necessario scorrere i puntelli variabile.

    OriginaleL’autore Nicolae Albu

  3. 1

    DataTable deve ricevere un insieme (ad esempio, un Elenco). La mappa non implementano l’interfaccia per la Raccolta. Si dovrebbe convertire la vostra mappa in un elenco e modificare, quindi convertire l’elenco in mappa. Ecco un buon link che mostra come fare:

    Naturalmente, non mi consiglia di aggiungere la logica del getter/setter, invece di utilizzare 2 diversi attributi e mantenere i metodi getter e setter il più pulito possibile.

    OriginaleL’autore Luiggi Mendoza

  4. 1

    Vostra proprietà classe deve implementare l’interfaccia della mappa qui: http://docs.oracle.com/javase/6/docs/api/java/util/Map.html

    La domanda migliore è, però, perché la creazione di una propria classe? Java offre una Proprietà di classe nell’SDK: http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html

    EDIT: Aggiornare la mia risposta per ogni richiesta di OP

    Modificare la seguente riga, quindi correggere gli errori di compilazione in Eclipse:

    public static class Properties{

    :

    public static class Properties implements Map<String, String> {

    EDIT #2: in Realtà la mia risposta è probabilmente sbagliato. L’OP non postare tutta la sua xhtml file, e ho fatto un presupposto che non è corretto.

    E ‘ un tipo diverso di Proprietà.
    Si può, si prega di fornire il codice su come implementare l’interfaccia della Mappa? Non l’ho scritto questo codice, sto solo cercando di aggiornare la pagina, ed è molto più avanzato rispetto alle mie competenze, quindi sto cercando di imparare come vado.

    OriginaleL’autore Jonathan S. Fisher

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *