班级';java.util.HashMap$Node';没有可写属性';键';

班级';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

如何解决这个问题: 我想用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="#{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
。如果查看for
Map.Entry
,您将看到:

  • 一个
    V getValue()
    方法
  • a
    void setValue(V)
    方法
  • 一个
    K getKey()
    方法,但是
  • 无效设置键(K)
    方法

基本上,根据JavaBeans约定,
key
属性是只读的。这实际上是一件好事,因为如果您可以在
集合中修改
,那么如果新的
与原始地图中另一个条目的
相同,您将遇到一个难题:该怎么办

这里真正的问题是,为什么要尝试更改
HashMap
节点的键?密钥是只读的违反了基本约定。好的,谢谢。我的想法是覆盖密钥。我希望将键值显示为小时-->分钟。我认为地图是一个很好的解决方案。在我的JPA模型中,有一个映射。我不知道如何在jsf和bean中表示这一点。您确定您所表示的是小时到分钟的映射吗?根据你的描述,这听起来像是一组小时/分钟对。我也考虑过这一点。你的意思是创建一个自己的类,具有小时和分钟属性?例如,设置间隔