在我正在研究的JSF应用程序中,我们曾经有一个金额的字段。在backing bean中,此属性的类型为BigDecimal:
<h:inputText id="amount" name="amount" value="#{backingBean.amount}" required="false"/>
支持Bean:
public class backingBean {
//...
BigDecimal amount;
//...
}
现在,我们引入了一个更改,所以从现在开始,我们有一个可变数量的输入字段。
<ui:repeat value="#{backingBean.participations}" var="participation" varStatus="status">
<h:inputText id="amount" name="amount" value="#{backingBean.amounts[participation.id]}" required="false"/>
</ui:repeat>
支持bean:
public class backingBean {
//...
Map<Long, BigDecimal> amounts;
//...
}
这项工作几乎没问题,但在提交表单后,地图内部条目的数量类型为<Object, Object>
而不是<Long, BigDecimal>
,正如您在调试器抓取的快照中所看到的那样: / p>
尝试使用地图执行任何操作时会出错。
作为一种解决方法,我已将地图类型更改为Map<Long, String>
并提供了转换地图的getter public Map<Long, BigDecimal> getAmounts()
,但我希望更简单。
答案 0 :(得分:1)
在运行时,地图的通用类型将被删除。因此,JSF无法知道您的地图值的类型是BigDecimal。这使它将值作为通用对象处理,默认值为String转换器。因此,在渲染页面时,会显示值的toString。重新提交时,该值将作为字符串输入到地图中。
您可以忽略调试器中显示的<Object, Object>
,这无关紧要。
您应该指定输入应使用bigdecimal转换器。这应该可以解决你的问题。
<ui:repeat value="#{backingBean.participations}" var="participation" varStatus="status">
<h:inputText id="amount" name="amount" value="#{backingBean.amounts[participation.id]}" required="false">
<f:converter converterId="javax.faces.BigDecimal"/>
</h:inputText>
</ui:repeat>