5

我被困住了,需要 JSF 专家的外部帮助来解决以下问题:我在 faces-config.xml 中为特定类定义了一些转换器,因此我不必一直使用转换器属性或标记。例如:

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

现在需要一个 JSF 组件(主要是 rich:extendedDataTable)的爬虫,它构建整个组件树并将一层一层地转换为 CSV、HTML 或以后可能需要的任何东西。即导出为 CSV、HTML 等的通用方式,无需每次都重新实现。它几乎完成了(感谢我的一位老同事的好主意),它确实工作得很好,除了一个部分:

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

该命令检索 h:outputText 的值并将其转换为字符串。如果有针对特定表达式结果的自定义转换器,那么最后一行是我想用转换器类替换的内容。我不知道如何为我的课程找到确切的转换器(由 faces-config 指定)。对于我的用例,FacesContext 似乎没有任何有用的方法/对象。直接访问 faces-config.xml 似乎有点错误。正确的方法可能类似于:

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

如果我为组件本身使用转换器 ID 和适当的属性/标签,那将相当容易,但我真的想避免那种无用的附加代码。

有人可以帮我吗?

4

1 回答 1

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);
于 2012-05-09T13:02:44.867 回答