java - 我如何在 JSF 中使用带有 UIData 的 java.util.Set。特别是 h :datatable?

标签 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 吗?

最佳答案

更简单的是,DataModel 中对Set(实际上是整个Collection 接口(interface))的支持是availableJSF 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)}" ...>

关于java - 我如何在 JSF 中使用带有 UIData 的 java.util.Set。特别是 h :datatable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9327479/

相关文章:

jsf - web.xml 配置以在 jsf 中的 session 超时后重定向到登录页面

java - 用Java开发搜索引擎前端

c# - 将数据表自动增量列与数据库同步

java - 如何访问 JPA 转换器中的 jdbc 连接?

java - java中的类级锁定

java - JSF 和过滤器重定向生成空白页

javascript - 如何更改数据表中每页值的结果

asp.net - linq orderby 升序?

java - 在 Spring 3 中是否可以动态设置 @ResponseStatus 的原因?

java - 如何导入外部 gradle 脚本文件并在 Gradle 中正确导入插件?