How to access Map key in jsf datatable

10,455

Solution 1

Until the upcoming JSF 2.2, the <h:dataTable>/<p:dataTable> doesn't support Collection<E>. It only supports among others List<E>.

You need to replace

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

by

private List<Properties> propertiesAsList;

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

and somewhere directly after map's initialization do this

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

(note: don't do it inside the getter!)

Solution 2

In the JSF code, you are trying to access the key property of the thing returned by getProperties() method, which is the entire collection. You need to iterate through the props variable.

Solution 3

Your properties class needs to implement the map interface here: http://docs.oracle.com/javase/6/docs/api/java/util/Map.html

The better question is though, why are you creating your own class? Java offers a Properties class in the SDK: http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html

EDIT: Update my answer per request of OP

Change the following line, then fix the compile errors in Eclipse:

public static class Properties{

to:

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

EDIT #2: Actually my answer is probably wrong. The OP didn't post his entire xhtml file, and I made an assumption that was incorrect.

Solution 4

The dataTable must receive a Collection (for example, a List). Map doesn't implement the Collection interface. You should convert your map into a list and modify it, then convert the list back into your map. Here's a good link showing how to do it:

Of course, I won't recommend you to add logic in the getter/setter, instead use 2 different attributes and keep the getter and setter the cleanest possible way.

Share:
10,455
Catfish
Author by

Catfish

Old enough to party. Nerdy by nature. Codementor Blog

Updated on June 05, 2022

Comments

  • Catfish
    Catfish almost 2 years

    I'm getting the error javax.el.PropertyNotFoundException: /member/apps/cms/edit.xhtml @228,49 value="#{props.key}": Property 'key' not found on type java.util.HashMap$Values when trying to display the datatable below.

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

    Here's the relevant part of my 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 + "";
            }
    
        }
    }
    

    How can i access the key value from my properties map?