我在一个绑定到Number字段的xpage上有一个comboBox。用于填充组合的SelectItem值的代码位于托管bean中,如下所示:
/*
* Returns last year, current year and next year as List<SelectItem>
* For use with comboBox selection values
*/
public List<SelectItem> getYearSelectItems() {
int thisYear = Calendar.getInstance().get(Calendar.YEAR);
List<SelectItem> selectItems = new ArrayList<SelectItem>();
selectItems.add(new SelectItem(new Integer(thisYear - 1), new Integer(thisYear - 1).toString()));
selectItems.add(new SelectItem(new Integer(thisYear), new Integer(thisYear).toString()));
selectItems.add(new SelectItem(new Integer(thisYear + 1), new Integer(thisYear + 1).toString()));
for(int i = 1; i < selectItems.size(); i ++) {
System.out.println(new Integer(i).toString() + ": " + selectItems.get(i).getValue().getClass());
}
return selectItems;
}
正如您所看到的,我将SelectItem值的类名打印到控制台以进行调试。控制台中列出的类名是java.lang.Integer,因此该部分绝对正确。
组合框使用数字转换器来匹配表单中的字段,仅限整数。
问题在于,使用此配置验证失败。
我知道这个网站上还有另一个问题可以解决类似的问题,但是因为我使用bean,所以我的角度不同。 在另一个问题中,有人建议这在853工作,但不在9工作。如果是这样的话;这是一个错误吗?这个bug有SPR吗?
请帮我澄清一下。
谢谢,Ove
答案 0 :(得分:2)
由于某些奇怪的原因,<xp:convertNumber>
错误解释了SelectItem(<Integer>, <String>)
。改为Double解决了我的问题。
代码:
/*
* Returns last year, current year and next year as List<SelectItem>
* For use with comboBox selection values
*/
public List<SelectItem> getYears() {
int thisYear = Calendar.getInstance().get(Calendar.YEAR);
List<SelectItem> years = new ArrayList<SelectItem>();
years.add((new SelectItem(new Double(thisYear - 1), new Integer(thisYear - 1).toString())));
years.add(new SelectItem(new Double(thisYear), new Integer(thisYear).toString()));
years.add(new SelectItem(new Double(thisYear + 1), new Integer(thisYear + 1).toString()));
}
return years;
}
答案 1 :(得分:0)
如果在转换器中使用integerOnly=true
,则“数字文本”框也不使用“整数”值。
您可以通过使用Object作为变量类型将这样的NumberField绑定到Bean来验证这一点,并将sysout(newValue.class)添加到getter&amp; setter。
如果使用Integer作为vartype,则在将值设置为Numberfield时将获得内部Invalid Argument异常。使用double时,您应该保存并通过验证。
这里我将如何使用Bean(代码很难看):
private static Map<String,Integer> years;
private double selectedYear = 2013;
static {
Integer thisYear = Calendar.getInstance().get(Calendar.YEAR);
years = new LinkedHashMap<String, Integer>();
years.put(new Integer(thisYear - 1).toString(),new Integer(thisYear - 1));
years.put((thisYear).toString(),new Integer(thisYear));
years.put(new Integer(thisYear + 1).toString(),new Integer(thisYear + 1));
}
public void yearChanged(ValueChangeEvent e){
System.out.println("event Start " + selectedYear);
selectedYear = years.get(e.getNewValue());//Set new Value to field
System.out.println("event End " + selectedYear);
}
public Object[] getYearInMap() {//select Items
return this.years.keySet().toArray();
}
//Binding for the NumberField
public void setSelectedYear(double selectedYear) {
this.selectedYear = selectedYear;
}
public double getSelectedYear() {
return selectedYear;
}
My Combobox和我的Field,输入文本是只读的,否则它会从Combobox和用户那里得到一个值。
<xp:comboBox
loaded="true"
id="comboBox2"
valueChangeListener="#{XPageBean.yearChanged}"
defaultValue="#{XPageBean.selectedYear}">
<xp:selectItems>
<xp:this.value><![CDATA[#{javascript:XPageBean.getYearInMap();}]]></xp:this.value>
</xp:selectItems>
<xp:eventHandler
event="onclick"
submit="true"
refreshMode="partial"
refreshId="refresh">
<xp:this.action><![CDATA[#{javascript://}]]></xp:this.action>
</xp:eventHandler>
</xp:comboBox>
<xp:panel id="refresh">
<xp:inputText
id="txt_out3"
value="#{XPageBean.selectedYear}"
defaultValue=""
readonly="true">
<xp:this.converter>
<xp:convertNumber
type="number"
integerOnly="true">
</xp:convertNumber>
</xp:this.converter>
</xp:inputText>
<xp:text id="txt_out2"
value="#{XPageBean.selectedYear}">
<xp:this.converter>
<xp:convertNumber
type="number"
integerOnly="true">
</xp:convertNumber>
</xp:this.converter>
</xp:text>
</xp:panel>