java - 类 'java.util.HashMap$Node' 没有可写属性 'key'

标签 java jsf primefaces

如何解决这个问题: 我想使用 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 约定,属性是只读的。这实际上是一件好事,因为如果您可以修改 keySet<Map.Entry>如果新的 key 出现,您会遇到该怎么办的难题与 key 相同原始 map 中的另一个条目。

关于java - 类 'java.util.HashMap$Node' 没有可写属性 'key',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44214740/

相关文章:

jsf - 如何更改 <p :calendar> language

java - 加载 CSV 文件并根据值创建新类实例

java - GWT 客户端 : Java object to json string and vice versa

JSF 用户界面 :include downside

jsf - 如何使用自定义标签在 JSF 页面中创建按钮

css - 从 p :layout 中删除排水沟

java - 检查字符串是否包含特殊字符

java - 在前端编程线程对话的正确方法

java - primefaces 组件无法使用自己的 css

javascript - 在上下文菜单 PrimeFaces 中右键单击后获取值