【问题标题】:How do I use a java.util.Set with UIData in JSF. Specifically h:datatable?如何在 JSF 中使用带有 UIData 的 java.util.Set。特别是 h:datatable?
【发布时间】:2012-03-08 19:22:31
【问题描述】:

我知道 UIData 不支持此功能,并且我理解原因,但这对于使用 JPA 和 JSF 的人来说应该是一个常见问题,因为在映射 M2M O2M 关系时,Set 是更好的集合。

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

我相信答案是创建一个 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 的类似代码吗?

【问题讨论】:

标签: java jsf datatable set el


【解决方案1】:

更简单的事情,支持Set(实际上是整个Collection接口)在DataModelavailableJSF 2.2。它目前已作为 snapshot 提供,因此您可以开始开发。它将在第二季度左右发布。


更新:根据 cmets,它似乎不能与 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)}" ...>

【讨论】:

  • 如何让 Maven 使用它?
  • 点击我回答中的“快照”链接。
  • 看起来这不是一个选项,我正在从事其他人建立的项目,他在 pom 中留下评论说 TOMCAT 不支持 2.1 所以不要升级jsf。
  • 那个人可能过度概括了 Mojarra 2.1.0 中的一个错误。这个错误导致第一个 JSF 2.1 版本在 Tomcat 中失败,因为 Mojarra 的家伙不小心在 2.1.1 中修复的注释扫描器中包含了 Glassfish 特定的代码。 Mojarra 2.1.1 和更新版本绝对可以在 Tomcat 中使用。更重要的是,我还将它用于我的 quick'n'dirty 游乐场项目。另见stackoverflow.com/questions/7805928/…
  • 你认为你可以抽出几分钟来帮助我完成这些 pom 内容吗?我从未使用过 Maven,但我很困惑,因为该站点声称该依赖项仅包含用于编译时的 api,那么该功能如何进入我的 WAR 和 tomcat?
猜你喜欢
  • 2011-04-30
  • 1970-01-01
  • 2011-03-18
  • 2012-09-08
  • 1970-01-01
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
相关资源
最近更新 更多