如何解决这个问题: 我想使用 primefaces 的 celledit 功能更改我的 bean 映射的键。 对于编辑 map 的值来说它效果很好。
为了更改 key ,我收到以下错误:
javax.el.PropertyNotWritableException: The class 'java.util.HashMap$Node' does not have a writable property 'key'.
<p:dataTable id="breaktime" var="item" value="#{breakTimeDataActions.map.entrySet().toArray()}"
editable="true" editMode="cell" >
<f:facet name="header">
</f:facet>
<p:ajax event="cellEdit" listener="#{breakTimeDataActions.onCellEdit}"
update=":form:msgs" />
<p:column headerText="#{texts['breaktime.hours']}">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{item.key}" />
</f:facet>
<f:facet name="input">
<p:spinner value="#{item.key}" min="0" max="24" converter="javax.faces.Integer" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="#{texts['breaktime.minute']}">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{breakTimeDataActions.map[item.key]}" />
</f:facet>
<f:facet name="input">
<p:spinner value="#{breakTimeDataActions.map[item.key]}" min="0" max="24" converter="javax.faces.Integer" />
</f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
最佳答案
出现错误的原因是entrySet 中的键是不可变的。 entrySet()
方法返回 Set<Map.Entry>
。如果你看javadocs对于 Map.Entry
你会看到:
- 一个
V getValue()
方法, - 一个
void setValue(V)
方法, - 一个
K getKey()
方法,但是 - 否
void setKey(K)
方法
基本上,key
根据 JavaBeans 约定,属性是只读的。这实际上是一件好事,因为如果您可以修改 key
在 Set<Map.Entry>
如果新的 key
出现,您会遇到该怎么办的难题与 key
相同原始 map 中的另一个条目。
关于java - 类 'java.util.HashMap$Node' 没有可写属性 'key',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44214740/