在ManagedBean中获取类的JSF转换器(JSF 1.2)

时间:2012-05-08 13:58:16

标签: jsf converter managed-bean faces-config

我遇到困难,需要JSF专家的外界帮助,并遇到以下问题: 我在faces-config.xml中为特定类定义了一些转换器,所以我不必一直使用converter-attribute或tag。例如:

    <converter>
      <converter-for-class>org.joda.time.DateTime</converter-for-class>
      <converter-class>com.example.converter.JodaDateTimeConverter</converter-class>
    </converter>

现在需要一个JSF-Component(主要是rich:extendedDataTable)的爬虫,它可以构建整个组件树,并逐级转换为CSV,HTML或稍后可能需要的任何内容。即导出为CSV,HTML,...的通用方法,无需每次重新实现它。这几乎已经完成了(感谢我的一位老同事的好主意),除了一部分外,它确实很有效:

    Object expressionResult = expression.getValue(FacesContext.getCurrentInstance().getELContext());
    expressionResultString = expressionResult.toString();

该命令检索h:outputText的值并将其转换为String。如果有针对特定expressionResult的自定义转换器,那么最后一行就是我想要用converter-for-class替换的。我无法找到如何为我的类找到精确的转换器(由faces-config指定)。 FacesContext似乎没有为我的用例提供任何有用的方法/对象。直接访问faces-config.xml似乎有点不对劲。正确的方法可能类似于:

    Converter converter = magically_fetch_the_correct_converter_for_expressionResult_type;
    converter.getAsString(FacesContext.getCurrentInstance(), component,
                                expressionResult);

如果我使用converter-id和组件本身的相应属性/标签会相当容易,但我真的想避免使用那种无用的附加代码。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:9)

您正在寻找Application#createConverter()

Object object = expression.getValue(context.getELContext());
Class<?> type = expression.getType(context.getELContext());
Converter converter = context.getApplication().createConverter(type);
String string = converter.getAsString(context, component, object);