3

javax.el.PropertyNotFoundException: /member/apps/cms/edit.xhtml @228,49 value="#{props.key}": Property 'key' not found on type java.util.HashMap$Values尝试显示下面的数据表时出现错误。

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

这是我的 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 + "";
        }

    }
}

如何从我的属性映射中访问键值?

4

4 回答 4

6

在即将到来的 JSF 2.2 之前,<h:dataTable>/<p:dataTable>不支持Collection<E>. 它只支持其中的一个List<E>

你需要更换

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

经过

private List<Properties> propertiesAsList;

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

在地图初始化之后的某个地方直接执行此操作

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

(注意:不要在吸气剂内部做!)

于 2012-07-18T23:37:15.363 回答
2

在 JSF 代码中,您尝试访问由 getProperties() 方法返回的事物的键属性,即整个集合。您需要遍历 props 变量。

于 2012-07-18T21:22:11.553 回答
1

dataTable 必须接收一个集合(例如,一个列表)。Map 没有实现 Collection 接口。您应该将地图转换为列表并对其进行修改,然后将列表转换回您的地图。这是一个很好的链接,展示了如何做到这一点:

当然,我不建议您在 getter/setter 中添加逻辑,而是使用 2 个不同的属性并保持 getter 和 setter 尽可能干净。

于 2012-07-18T21:18:16.540 回答
1

您的属性类需要在这里实现地图接口:http: //docs.oracle.com/javase/6/docs/api/java/util/Map.html

更好的问题是,你为什么要创建自己的课程?Java 在 SDK 中提供了一个 Properties 类:http: //docs.oracle.com/javase/7/docs/api/java/util/Properties.html

编辑:根据 OP 的请求更新我的答案

更改以下行,然后修复 Eclipse 中的编译错误:

public static class Properties{

至:

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

编辑#2:实际上我的回答可能是错误的。OP 没有发布他的整个 xhtml 文件,我做了一个不正确的假设。

于 2012-07-18T21:09:34.320 回答