6

我在这里的一个项目中使用 JSF 1.2 和 IceFaces 1.8。

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

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

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

/pages/page.xhtml @79,14 value="#{row.targetValue}": java.lang.IllegalArgumentException: 参数类型不匹配

/pages/page.xhtml @79,14 value="#{row.targetValue}": java.lang.IllegalArgumentException: java.lang.ClassCastException@1449aa1

页面如下所示:

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

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

我确定我可能遗漏了一些非常简单的东西,但我已经盯着这个看了一段时间,没有立即明显的答案!

4

1 回答 1

4

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

似乎有三种解决方案:

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

不幸的是,由于其他原因,#1 不是我的选择,我目前不想编写自己的转换器。但是,如果我更改代码以删除 convertNumber,一切似乎都正常。(我还更新了Double我查看的链接之一中建议的值对象类型)。

这可以防止异常,看起来 JSF 仍在做我想做的事情。只是烦人的是,您似乎无法convertNumber在同一实例中指定和转换类型。

于 2010-02-16T15:12:21.590 回答