我知道这在 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))的支持是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)}" ...>
关于java - 我如何在 JSF 中使用带有 UIData 的 java.util.Set。特别是 h :datatable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9327479/