我有一个使用Spring 3.0的JSF2应用程序。我有一个bean,它具有类型为List<Double>
的属性,包含5个元素:
public class MyBean {
private List<Double> values;
public List<Double> getValues() {
if (values == null) {
values = new ArrayList<Double>(5);
for (int i = 0; i < 5; i++) {
values.add(null);
}
}
return values;
}
public void setValues(List<Double> values) {
this.values = values;
}
}
在我的xhtml文件中,我对每个元素都有这个:
<h:inputText id="value1" value="#{myBean.values[0]}">
<f:convertNumber pattern="#########0.##" />
</h:inputText>
我的目的是将值检索为ArrayList
。另外,我不想为每个成员保留单独的属性。未来的要求将使值的总数变为动态(而不是硬编码的5),因此我可以使用循环来定义每个元素的输入,但现在不要关注它。
所以这就是问题所在。提交页面时,转换不正确。例如,如果我的输入是1,2.0,3(和最后两个元素的2个空输入,它们不是必需的),我收到以下数组[1,“2.0”,3,“”,“”] ,其中1和3的类型为BigDecimal
,而2.0和最后2个成员是空字符串。每次我尝试获取数组列表的成员时,这会导致ClassCastexception
,因为根据定义,它是通用的,泛型类型是Double
。 BigDecimal
无法投放到Double
;很明显,字符串强制转换尝试也会失败。现在,我已经预计至少所有成员都会被转换器转换成相同的类型。另外,我需要一种方法来正确地获得Double。我也尝试了以下内容:
<h:inputText id="value1" value="#{myBean.values[0]}">
<f:converter id="javax.faces.Double" />
</h:inputText>
但它引起了例外:
<f:converter> Default behavior invoked of requiring a converter-id passed in the constructor, must override ConvertHandler(ConverterConfig)
我必须承认我是JSF技术的新手,但就this文章而言,没有必要覆盖任何内容。任何帮助将不胜感激
答案 0 :(得分:13)
<f:converter>
没有id
属性,而是converterId
。另请参阅tag documentation。所以,这应该做:
<h:inputText id="value1" value="#{myBean.values[0]}">
<f:converter converterId="javax.faces.Double" />
</h:inputText>
甚至
<h:inputText id="value1" value="#{myBean.values[0]}" converter="javax.faces.Double" />