班级';java.util.HashMap$Node';没有可写属性';键';
如何解决这个问题: 我想用primefaces的celledit功能更改我的bean映射的键。 对于编辑地图的值,它工作得很好 对于更改密钥,我遇到以下错误:班级';java.util.HashMap$Node';没有可写属性';键';,java,jsf,primefaces,Java,Jsf,Primefaces,如何解决这个问题: 我想用primefaces的celledit功能更改我的bean映射的键。 对于编辑地图的值,它工作得很好 对于更改密钥,我遇到以下错误: javax.el.PropertyNotWritableException: The class 'java.util.HashMap$Node' does not have a writable property 'key'. <p:dataTable id="breaktime" var="item" value="#{bre
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>
javax.el.PropertyNotWritableException:类“java.util.HashMap$Node”没有可写属性“key”。
出现错误的原因是entrySet中的键是不可变的。entrySet()
方法返回一个Set
。如果查看forMap.Entry
,您将看到:
- 一个
方法V getValue()
- a
方法void setValue(V)
- 一个
方法,但是K getKey()
- 无
方法无效设置键(K)
基本上,根据JavaBeans约定,
key
属性是只读的。这实际上是一件好事,因为如果您可以在集合中修改键
,那么如果新的键
与原始地图中另一个条目的键
相同,您将遇到一个难题:该怎么办 这里真正的问题是,为什么要尝试更改HashMap
节点的键?密钥是只读的违反了基本约定。好的,谢谢。我的想法是覆盖密钥。我希望将键值显示为小时-->分钟。我认为地图是一个很好的解决方案。在我的JPA模型中,有一个映射。我不知道如何在jsf和bean中表示这一点。您确定您所表示的是小时到分钟的映射吗?根据你的描述,这听起来像是一组小时/分钟对。我也考虑过这一点。你的意思是创建一个自己的类,具有小时和分钟属性?例如,设置间隔