如何在JSF中将java.util.Set与UIData一起使用。特别是h:数据表?

如何在JSF中将java.util.Set与UIData一起使用。特别是h:数据表?,java,jsf,datatable,set,el,Java,Jsf,Datatable,Set,El,我知道UIData不支持这一点,我也理解为什么,但这对于使用JPA和JSF的人来说应该是一个常见问题,因为在映射m2mo2m关系时,集合是最好的集合 我知道我需要创建一些结构,以便在需要时将我的属性转换为列表,但在广泛搜索这个问题后,我所能找到的只是它不起作用的原因,以及解决方案的细微提示 我相信答案是创建一个ELResolver来处理这个问题,但是它们的结构和工作方式让我感到困惑,我不明白为什么我需要成为一个写这篇文章的人,当这是一个常见的问题时,肯定有人写了一个ELResolver来处理这个

我知道UIData不支持这一点,我也理解为什么,但这对于使用JPA和JSF的人来说应该是一个常见问题,因为在映射m2mo2m关系时,集合是最好的集合

我知道我需要创建一些结构,以便在需要时将我的属性转换为列表,但在广泛搜索这个问题后,我所能找到的只是它不起作用的原因,以及解决方案的细微提示

我相信答案是创建一个ELResolver来处理这个问题,但是它们的结构和工作方式让我感到困惑,我不明白为什么我需要成为一个写这篇文章的人,当这是一个常见的问题时,肯定有人写了一个ELResolver来处理这个问题

我找到了这篇关于这个主题的文章,但我无法复制它,因为较新的JSF似乎不允许它:

这是:


它充满了不推荐使用的代码,因为它是预解析程序。但我就是找不到如何实现ELResolver来实现它。有人能给我指出一些有效的代码或至少类似的东西来帮助我了解如何使用ELResolver吗?

一些更简单的东西,支持
数据模型
中的
集合
接口(实际上,整个
集合
接口)都在。它目前已经可用,以便您可以开始开发。它将在第二季度左右发布


更新:根据评论,它似乎没有与SpringWebFlow无缝地协同工作。事实证明它与JSF2.2不兼容(最初也不兼容JSF2.1)。那么,定制的
ELResolver
应该是您的最佳选择

最简单的方法是让它扩展
ListELResolver
,如下所示:

public class SetToListELResolver extends ListELResolver {

    public static final String KEY_PROPERTY = "setToList";

    @Override
    public Object getValue(ELContext context, Object base, Object property) {
        if (base instanceof Set<?> && KEY_PROPERTY.equals(property)) {
            context.setPropertyResolved(true);
            return new ArrayList<Object>((Set<?>) base);
        }

        return super.getValue(context, base, property);
    }

}
然后您可以在
{bean.set.setToList}
的语法中使用它,其中
.setToList
是一个特殊属性,它将触发转换:


它将实际上以一种虚构的方式结束



如何让Maven使用它?单击我答案中的“快照”链接。看起来这不是一个选项,我正在从事一个由其他人建立的项目,他在pom中留下评论说TOMCAT不支持2.1,所以不要升级jsf。这个人可能过度概括了Mojarra 2.1.0中的一个bug。这个错误导致了第一个JSF2.1版本在Tomcat中失败,因为Mojarra的家伙在注释扫描器中意外地包含了Glassfish特定的代码,这在2.1.1中得到了修复。Mojarra 2.1.1和更新版本肯定在Tomcat中工作。更重要的是,我还将它用于我的快速“n”脏操场项目。你觉得你能抽出几分钟来帮我完成这个pom吗?我从未使用过Maven,但我感到困惑,因为该网站声称依赖项只包括编译时的api,那么该功能如何进入我的WAR和tomcat?另请参见前JSF规范负责人编写的。