0

编写一个简单的 JSF 应用程序我遇到了以下问题:我的 entity.controller.EntityNameManager 类包含一个 getEntityNameSelectList() 方法,我可以使用它来填充 ComboBox。这有效并显示了所有实体,因为检索实体的方法没有 where 子句。此方法是自动创建的。

现在我想要第二个类似的方法,它根据 sessionscope 中的变量过滤选项。为此,我复制了原始方法,将其重命名为 getEntityNameSelectListByUser(User theUser),并将查询数据库的方法更改为确实按 UserId 过滤的方法。

但是,当尝试在浏览器中加载页面时,我收到一条错误消息,指出控制器类没有“EntityNameSelectListByUser”属性。我假设由于我的新方法需要一个参数,所以找不到它。有没有办法让它知道参数或 Sessionscope 用户标识?

4

1 回答 1

0

JSR 245的下一个维护版本计划支持 EL 中的参数(此处发布公告;此处实现)。


假设您不想等待 JEE6,您有几种方法可以克服此限制。这些方法是根据 POJO 托管 bean 定义的,因此请酌情将它们调整为您的 EJB。

1.

在支持 bean 中进行会话查找和函数调用:

  public String getFoo() {
    FacesContext context = FacesContext
        .getCurrentInstance();
    ExternalContext ext = context.getExternalContext();
    String bar = (String) ext.getSessionMap().get("bar");
    return getFoo(bar);
  }

示例绑定:

#{paramBean.foo}

2.

使用EL 函数(在 TLD 中定义,映射到公共静态方法):

  public static String getFoo(ParamBean bean, String bar) {
    return bean.getFoo(bar);
  }

示例绑定:

#{baz:getFoo(paramBean, bar)}

3.

颠覆 Map 类来调用函数(有点小技巧,仅限于一个参数):

  public Map<String, String> getFooMap() {
    return new HashMap<String, String>() {
      @Override
      public String get(Object key) {
        return getFoo((String) key);
      }
    };
  }

示例绑定:

#{paramBean.fooMap[bar]}
于 2009-06-28T21:42:20.380 回答