【问题标题】:The class 'java.util.HashMap$Node' does not have a writable property 'key'“java.util.HashMap$Node”类没有可写属性“key”
【发布时间】:2017-05-27 08:35:32
【问题描述】:

如何解决这个问题: 我想使用 primefaces 的 celledit 功能更改我的 bean 映射的键。 对于编辑 map 的值,它工作得很好。

为了更改密钥,我收到以下错误:

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>

【问题讨论】:

  • 这里真正的问题是你为什么要尝试更改HashMap 节点的密钥?密钥是只读的,这违反了基本合同。

标签: java jsf primefaces


【解决方案1】:

您收到错误的原因是 entrySet 中的键是不可变的。 entrySet() 方法返回 Set&lt;Map.Entry&gt;。如果您查看javadocsMap.Entry,您会看到:

  • V getValue() 方法,
  • void setValue(V) 方法,
  • K getKey() 方法,但是
  • 没有void setKey(K)方法

基本上,根据 JavaBeans 约定,key 属性是只读的。这实际上是一件好事,因为如果您可以修改Set&lt;Map.Entry&gt; 中的key,那么如果新的key 与@987654333 相同,您将遇到一个难题: @原始地图中的另一个条目。

【讨论】:

  • 好的,谢谢。我的想法是覆盖密钥。我想将键值显示为小时 --> 分钟。我认为地图是一个很好的解决方案。在我的 JPA 模型中,有一张地图。我不知道如何在 jsf 和 bean 中表示这一点。
  • 您确定您所代表的是小时到分钟的映射吗?根据您的描述,听起来像是一组小时/分钟对。
  • 我也想过这个。你的意思是创建一个自己的类,具有小时和分钟属性?例如 Set 间隔
猜你喜欢
  • 2016-08-30
  • 1970-01-01
  • 2013-11-30
  • 2018-07-01
  • 2016-05-11
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
相关资源
最近更新 更多