PrimeFaces Select类型控件不走converter
Posted on: 2013-11-15, Last modified: 2015-07-31, View: 2505
Posted on: 2013-11-15, Last modified: 2015-07-31, View: 2505
生产中遇到这种情况,例如当前控件是<p:selectOneRadio/>,而且<f:selectItem/>的itemValue是字符串类型,形如这样的代码:
<pf:selectOneRadio id="itemRadio" ...>
<f:selectItem itemLabel="item0" itemValue="0"/>
<f:selectItem itemLabel="item1" itemValue="1"/>
<f:selectItem itemLabel="item2" itemValue="2"/>
<f:selectItem itemLabel="itwm3" itemValue="3"/>
<pf:ajax/>
<f:converter converterId="myConverter"/>
</pf:selectOneRadio>
这个时候,在首次进入页面绘制控件的时候,发现并没有调用converter,而如果使用<f:SelectOneRadio/>没有这样的问题,查看PrimeFaces(这里仅指version3.0.1)的源代码发现,是因为primefaces在InputRender.java类里定义了GetOptionAsString ()方法,当当前值是String类型的时候, 直接返回String类型值,否则才调用converter给出预期String。
protected String getOptionAsString(FacesContext context, UIComponent component, Converter converter, Object value) { if(value == null) return ""; else if(value instanceof String) return (String) value; else if(converter != null) return converter.getAsString(context, component, value); else return value.toString(); }
只要重写这个方法就可以顺利地调用你定义的Converter了。