编写一个简单的JSF应用程序我遇到了以下问题: 我的entities.controller.EntityNameManager类包含一个方法getEntityNameSelectList(),我可以使用它来填充ComboBox。这可以工作并显示所有实体,因为检索实体的方法没有where子句。 此方法已自动创建。
现在我想要第二个类似的方法,它根据sessionscope中的变量过滤选项。为此,我复制了原始方法,将其重命名为getEntityNameSelectListByUser(User theUser),并将查询数据库的Method更改为确实按UserId筛选的方法。
但是,当尝试在浏览器中加载页面时,我收到一条错误,指出控制器类没有“EntityNameSelectListByUser”属性。我假设因为我的新方法需要一个参数,所以无法找到它。有没有办法让它知道参数或Sessionscope用户ID?
答案 0 :(得分:0)
EL中的参数支持将在JSR 245的下一个维护版本中发布(公告here;实施here)。
假设您不想等待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 function(在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]}