首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态JSF转换器

动态JSF转换器
EN

Stack Overflow用户
提问于 2013-05-06 18:47:50
回答 2查看 2K关注 0票数 0

我的JSF应用程序背后的数据访问层对日期字段使用两种不同的格式(有时是ddmmyyyy,有时是yyyymmdd);显示的日期总是dd/mm/yyyy。

有没有办法对一个字段使用两个不同的转换器,并决定动态使用哪一个?例如“如果单击此命令按钮,则使用此转换器,否则,如果单击其他命令按钮,则使用该转换器”。

EN

回答 2

Stack Overflow用户

发布于 2014-02-14 08:37:28

BalusC解释了为什么这在这里很难:https://stackoverflow.com/a/7123153/3284943

根据他的建议,我创建了以下内容:

在JSF文件中,我使用自定义转换器及其定义的属性在运行时选择转换器和动态属性。这是一个动态PrimeFaces DataTable的代码片段:

代码语言:javascript
复制
<h:outputText rendered = "#{column.dateTime}" value="#{table[column.name]}">
    <f:converter converterId="runtimeConverterSelector" />
    <f:attribute name="converterId" value="#{column.converterName}" />
    <f:attribute name="pattern" value="#{column.converterPattern}" />
</h:outputText>

自定义转换器:

代码语言:javascript
复制
@FacesConverter ("runtimeConverterSelector")
public class RuntimeConverterSelector implements Converter {
    Converter delegateConverter;
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        retrieveAttributes(component);
        return delegateConverter.getAsObject(context, component, value);
    }
    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        retrieveAttributes(component);
        return delegateConverter.getAsString(context, component, value);
    }
    private void retrieveAttributes(UIComponent component) {
        Object attribute;
        attribute = component.getAttributes().get("converterId");
        if (attribute != null) {
            String converterName = (String)attribute;
            switch (converterName) {
                case "javax.faces.BigDecimal":
                    delegateConverter = new BigDecimalConverter();
                    break;
                case "javax.faces.BigInteger":
                    delegateConverter = new BigIntegerConverter();
                    break;
                case "javax.faces.Boolean":
                    delegateConverter = new BooleanConverter();
                    break;
                case "javax.faces.Byte":
                    delegateConverter = new ByteConverter();
                    break;
                case "javax.faces.Character":
                    delegateConverter = new CharacterConverter();
                    break;
                case "javax.faces.DateTimeConverter":
                    delegateConverter = new DateTimeConverter();
                    attribute = component.getAttributes().get("pattern");
                    if (attribute != null) ((DateTimeConverter)delegateConverter).setPattern((String)attribute);
                    attribute = component.getAttributes().get("timeZone");
                    if (attribute != null) ((DateTimeConverter)delegateConverter).setTimeZone(TimeZone.getTimeZone((String)attribute));
                    attribute = component.getAttributes().get("dateStyle");
                    if (attribute != null) ((DateTimeConverter)delegateConverter).setDateStyle((String)attribute);
                    attribute = component.getAttributes().get("timeStyle");
                    if (attribute != null) ((DateTimeConverter)delegateConverter).setDateStyle((String)attribute);
                    attribute = component.getAttributes().get("type");
                    if (attribute != null) ((DateTimeConverter)delegateConverter).setDateStyle((String)attribute);
                    break;
                case "javax.faces.Double":
                    delegateConverter = new DoubleConverter();
                    break;
                case "javax.faces.Enum":
                    delegateConverter = new EnumConverter();
                    break;
                case "javax.faces.Float":
                    delegateConverter = new FloatConverter();
                    break;
                case "javax.faces.Integer":
                    delegateConverter = new IntegerConverter();
                    break;
                case "javax.faces.Long":
                    delegateConverter = new LongConverter();
                    break;
                case "javax.faces.Number":
                    delegateConverter = new NumberConverter();
                    attribute = component.getAttributes().get("currencyCode");
                    if (attribute != null) ((NumberConverter)delegateConverter).setCurrencyCode((String)attribute);
                    attribute = component.getAttributes().get("currencySymbol");
                    if (attribute != null) ((NumberConverter)delegateConverter).setCurrencySymbol((String)attribute);
                    attribute = component.getAttributes().get("groupingUsed");
                    if (attribute != null) ((NumberConverter)delegateConverter).setGroupingUsed(Boolean.parseBoolean((String)attribute));
                    attribute = component.getAttributes().get("integerOnly");
                    if (attribute != null) ((NumberConverter)delegateConverter).setIntegerOnly(Boolean.parseBoolean((String)attribute));
                    attribute = component.getAttributes().get("locale");
                    if (attribute != null) ((NumberConverter)delegateConverter).setLocale(new Locale((String)attribute));
                    attribute = component.getAttributes().get("maxFractionDigits");
                    if (attribute != null) ((NumberConverter)delegateConverter).setMaxFractionDigits(Integer.parseInt((String)attribute));
                    attribute = component.getAttributes().get("maxIntegerDigits");
                    if (attribute != null) ((NumberConverter)delegateConverter).setMaxIntegerDigits(Integer.parseInt((String)attribute));
                    attribute = component.getAttributes().get("minFractionDigits");
                    if (attribute != null) ((NumberConverter)delegateConverter).setMinFractionDigits(Integer.parseInt((String)attribute));
                    attribute = component.getAttributes().get("minIntegerDigits");
                    if (attribute != null) ((NumberConverter)delegateConverter).setMinIntegerDigits(Integer.parseInt((String)attribute));
                    attribute = component.getAttributes().get("pattern");
                    if (attribute != null) ((NumberConverter)delegateConverter).setPattern((String)attribute);
                    attribute = component.getAttributes().get("type");
                    if (attribute != null) ((NumberConverter)delegateConverter).setType((String)attribute);
                    break;
                case "javax.faces.Short":
                    delegateConverter = new ShortConverter();
                    break;
                default:
                    System.err.println("ConverterId provided to runtimeConverterSelector, '" + converterName + "' is invalid. The default converter will be used");
                    break;
            }
        } else {
            System.err.println("No converterId was provided to runtimeConverterSelector.  The default converter will be used.");
        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2013-05-06 19:30:28

这是不可能的。但是您可以在一个转换器中检查这两种格式。当然,到字符串的转换将基于一种格式完成。或者,您可以基于当前Locale设置日期格式。基本示例:

代码语言:javascript
复制
@FacesConverter("doubleDateConverter")
public class DateConverter implements Converter {

    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if(value == null || value.equals("")) {
            return null;
        }
        SimpleDateFormat format1 = new SimpleDateFormat("ddMMyyyy");
        SimpleDateFormat format2 = new SimpleDateFormat("yyyyMMdd");
        Date date = null;
        boolean valid = true;
        try {
            date = format1.parse(value);
        } catch (ParseException e) {
            valid = false;
        }
        if(!valid) {
            try {
                date = format2.parse(value);
            } catch (ParseException e) {
                valid = false;
            }
        }
        if((!valid) || (date == null)) {
            throw new ConverterException(new FacesMessage("Date is in wrong format: " + value));
        }
        return date;
    }

    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if (!(value instanceof Date) || (value == null)) {
            return null;
        }
        SimpleDateFormat format = new SimpleDateFormat("ddMMyyyy");
        return format.format((Date)value);
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16397105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档