我遇到困难,需要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和组件本身的相应属性/标签会相当容易,但我真的想避免使用那种无用的附加代码。
有人可以帮助我吗?
答案 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);