jsf - 带转换器的复合 JSF 组件

标签 jsf jsf-2 converter composite-component

我有复合 JSF 组件 TimePicker.xhtml带有支持组件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目的。日期的部分与我无关,我只需要对象的时间部分。
顺便说一句,作为临时解决方案,我将使用 getConvertedValue如本文所述,来自 巴鲁斯C Composite component with multiple input fields但也想知道如何将此功能委托(delegate)给外部转换器,如文章中所述

Normally this method is not to be overridden and everything is delegated to default JSF Converter mechanisms

最佳答案

为了使用转换器,您可以在方法 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 )作为源。可以以与我完全相同的方式检索此类转换器。

关于jsf - 带转换器的复合 JSF 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29645750/

相关文章:

javascript - 具有德语语言环境的 PrimeFaces Spinner

java - 数据库中的 primefaces 图形图像未加载

jsf - PrimeFaces:有没有办法在 <p:message> 中放置超链接

spring - 未调用 Mongo 映射转换器

audio - HE-AAC转换

java - 从 javaBean 获取属性

java - 从数据库返回值时数字格式异常(JPA)

jsf - session 过期后 Spring Security 登录重定向到最后一个 JSF ajax 请求并以纯文本形式显示其 <partial-response> XML 响应

jakarta-ee - 如何干净地结束 CDI @ConversationScoped

用于奇数图像类型的 Java JPEG 转换器