带转换器的复合JSF组件

时间:2015-04-15 08:51:19

标签: jsf jsf-2 converter composite-component

我有一个带有支持组件TimePicker.xhtml的复合JSF组件timePickerComponent,其用法如下:

      <mi:timePicker style="display: initial;"
        widgetVar="toTimepickerWidget"
        converter="#{timePickerConverter}"
                            value="#{calendarBean.event.to}" 
      /> 

timePickerConverter以通常的方式创建:

public class TimePickerConverter implements Converter, Serializable {
    @Override
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2)
            throws ConverterException {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2)
            throws ConverterException {
        // TODO Auto-generated method stub
        return null;
    }
}

如何在复合组件中使用此转换器?

更新:

这是复合组件的代码:

<cc:implementation componentType="timePickerComponent">
    <h:outputScript name="js/timepicker/timepicker_helper.js" target="head"/>
    <div id="#{cc.clientId}" style="#{cc.attrs.style}">

            <p:inputText id="timepicker"
                    scrollHeight="200"
                    value="#{cc.timeLocal}"  
                    size="5"/>

    </div>
</cc:implementation>

基本上我想要的是将纯文本从inputText转换为Date对象。日期的部分与我无关,我只需要Time的一部分。 顺便说一下,作为临时解决方案,我将使用{strong> BalusC Composite component with multiple input fields中的本文所述的getConvertedValue但是想知道如何将此功能委托给外部转换器,如文章

中所述
  

通常这种方法不会被覆盖,一切都是   委托默认的JSF转换器机制

1 个答案:

答案 0 :(得分:4)

为了使用转换器,您可以在方法getConvertedValue中的后备组件中显式调用转换器。可以从组件的converter属性中检索转换器:

@FacesComponent("timePickerComponent")
public class TimePickerComponent extends UIInput implements NamingContainer {

    ...

    @Override
    public Object getSubmittedValue() {
        UIInput hourComp = (UIInput) findComponent("timepicker_hour");
        UIInput minutesComp = (UIInput) findComponent("timepicker_minutes");
        return hourComp.getSubmittedValue() + ":" + minutesComp.getSubmittedValue();
    }

    @Override
    protected Object getConvertedValue(FacesContext context,
            Object newSubmittedValue) throws ConverterException {
        Converter converter = (Converter) getAttributes().get("converter");
        if (converter != null) {
            return converter.getAsObject(context, this, (String) newSubmittedValue);
        } else {
            return newSubmittedValue;
        }
    }

}

参见示例代码: https://github.com/destin/SO-answers/tree/master/SO-composite-jsf-component-with-converter

但是,此方法的缺点是JSF组件从String转换。据我所知,你的组件包含很少的子元素。他们所有的值都需要转换为字符串(就像我做的那样:hourComp.getSubmittedValue() + ":" + minutesComp.getSubmittedValue())。

因此,如果TimeConverters独立于JSF组件,您可能更愿意定义自己的层次结构。这样的转换器将能够使用少量参数或一些复杂对象(如Time)作为源。这样的转换器可以用与我完全相同的方式检索。