我在尝试显示下面的数据表时收到错误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 + "";
}
}
}
如何从我的属性映射中访问键值?
答案 0 :(得分: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());
(注意:不要在吸气剂内部进行!)
答案 1 :(得分:2)
在JSF代码中,您尝试访问getProperties()方法返回的事物的键属性,该方法是整个集合。你需要遍历props变量。
答案 2 :(得分: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文件,我做了一个不正确的假设。
答案 3 :(得分:1)
dataTable必须接收Collection(例如,List)。 Map不实现Collection接口。您应该将地图转换为列表并进行修改,然后将列表转换回地图。这是一个很好的链接,展示了如何做到这一点:
当然,我不建议你在getter / setter中添加逻辑,而是使用2个不同的属性,让getter和setter保持最干净的方式。