使用ui映射内部地图:重复抛出UpdateModelException

时间:2016-02-23 11:28:20

标签: jsf el uirepeat

有一个

Map<String,Map<Double,Double>> priceMatrix

我想在

中使用它
<ui:repeat value="#{calcModel.priceMatrix.keySet().toArray()}" var="x">
    <div style="display: inline-block; margin-right: 10px">
        <h:inputText value="#{x}" />
    </div>
    <ui:repeat value="#{calcModel.priceMatrix.get(x).keySet().toArray()}" var="y">
        <div style="display: inline-block; margin-right: 10px">
            <h:inputText value="#{y}" />
        </div>
        <div style="display: inline-block;">
            <h:inputText value="#{calcModel.priceMatrix.get(x).get(y)}" />
        </div>
        <br />
    </ui:repeat>

</ui:repeat>

如果我发布公式,我会收到带有消息的UpdateModelException:

value="#{calcModel.priceMatrix.get(x).get(y)}": Illegal Syntax for Set Operation

这个问题让我在6个多小时后变得非常糟糕。我的第一个想法是在我的bean中提供自己的getter和setter。由于jsf在调用setter之前调用了getter,所以这个dosn无效。

我的问题有解决方案吗?

使用List会更好吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

<h:inputText value="#{calcModel.priceMatrix.get(x).get(y)}" />

这确实不是一个可写的值表达式。这表示只读值表达式。 EL无法弄清楚如何在其上调用setter,因为EL表达式表示方法调用链而不是嵌套属性。

您需要使用表示嵌套属性的括号表示法[]的可写值表达式替换它。

<h:inputText value="#{calcModel.priceMatrix[x][y]}" />

您的其他输入看起来也不好看,value="#{x}"肯定也无法写入,但您现在能够找到正确的语法:只需使用#{map[key]}语法而不是#{key}

请注意,这不是特定的JSF问题。您可以在堆栈跟踪中找到的异常根源是javax.el.PropertyNotWritableException。正如它的包javax.el所说,它是一个EL问题,而不是JSF问题。