我在这里的项目中使用的是带有IceFaces 1.8的JSF 1.2。

我有一个页面,该页面基本上是用于一大堆浮点数字段的大型编辑网格。这是通过页面上的inputText字段实现的,该字段指向具有原始float类型的值对象

现在,由于一项新要求看到某些字段是可为空的,因此我想将value对象更改为使用Float对象而不是原始类型。我认为我不需要对页面做任何事情来适应这一点。

但是,当我进行更改时,出现以下错误:







该页面如下所示:

<ice:inputText value="#{row.targetValue}" size="4">
  <f:convertNumber pattern="###.#" />
</ice:inputText>

我也尝试过在其中添加<f:convert convertId="javax.faces.Float" />,但这似乎也不起作用!将值对象类型更改为Double也不行。

我敢肯定我可能会遗漏一些非常简单的东西,但是我已经盯着它看了一阵子了,没有答案是显而易见的!

最佳答案

经过一些调查(例如hereherehere),<f:convertNumber>是问题所在。它似乎转换为数字取决于您给它的输入-它可以是整数或浮点数。换句话说,它不查看目标类型,而只是生成java.lang.Number的实例。尽管我无法确定这是否是因为我在某个地方使用的是旧版本的JSF或EL或类似的东西,但这并不理想。

似乎有三种解决方案:

  • 使用java.lang.Number作为您的值对象类型;
  • 编写您自己的转换器;
  • 不要使用<f:convertNumber>

  • 不幸的是,由于其他原因,我无法选择#1,而且我现在不想编写自己的转换器。但是,如果我更改代码以删除convertNumber,则一切似乎正常。 (我还将值对象类型更新为Double,这在我查看的链接之一中已建议)。

    这样可以防止出现异常,并且JSF似乎仍在按照我想要的去做。只是令人讨厌,似乎您无法在同一实例中指定convertNumber和convert类型。

    10-08 01:32