PrimeFaces Select类型控件不走converter
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了。

 

 

Go
Friend Links:
Sonft