如何在JSF中使用带有UIData的java.util.Set。特别是h:数据表?

时间:2012-02-17 11:32:23

标签: java jsf datatable set el

我知道UIData不支持这个,我理解为什么,但这应该是使用JPA和JSF的人的常见问题,因为在映射M2M O2M关系时,Sets是优秀的集合。

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

我相信答案是创建一个ELResolver来处理这个问题,但是它们的结构以及它们的工作方式令我感到困惑,我不明白为什么在这是一个常见的问题时我需要成为一个写这个的人,当然有人写了一个ELResolver来做这个吗?

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

http://techblog.bozho.net/?p=28&cpage=1#comment-13700

而且:

http://www.jroller.com/mert/entry/settolistpropresolver_for_jsf_el

其中包含已弃用的代码,因为它是ELResolver之前的代码。但我只是找不到如何实现ELResolver来做到这一点。有人可以指出一些有用的代码或至少类似的东西可以帮助我理解如何使用ELResolver吗?

1 个答案:

答案 0 :(得分:7)

更简单,SetCollection(实际上,整个DataModel界面)的支持在available中为JSF 2.2。它目前已作为snapshot提供,因此您可以开始开发。它将在第二季度发布。


更新:根据评论,它似乎与Spring Web Flow无缝协作。事实证明,它不兼容JSF 2.2(最初也不兼容JSF 2.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);
    }

}

如果您在faces-config.xml

中注册如下
<application>
    <el-resolver>com.example.SetToListELResolver</el-resolver>
</application>

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

<h:dataTable value="#{bean.set.setToList}" ...>

它将有效地以虚构的方式结束

<h:dataTable value="#{new ArrayList(bean.set)}" ...>