支持Bean Map属性,问题类型

时间:2014-08-11 15:02:06

标签: jsf generics map el

在我正在研究的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>

enter image description here

尝试使用地图执行任何操作时会出错。

作为一种解决方法,我已将地图类型更改为Map<Long, String>并提供了转换地图的getter public Map<Long, BigDecimal> getAmounts(),但我希望更简单。

  • 我在这里做错了吗?
  • 这是一个已知的JSF错误吗?
  • 使用最少的代码来实现这一点的任何想法?

1 个答案:

答案 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>