【发布时间】:2014-04-30 12:13:21
【问题描述】:
我想从 Primefaces 的 selectManyCheckbox 菜单中选择值,并将所选值设置为稍后在写入数据库的方法中使用的属性。 这是该组件的 .xhtml 页面中的代码:
<p:selectManyCheckbox id="chkbox1"
value="#{requestBean.filterTypeBean.selectedBooleanFilterTypes}"
layout="pageDirection" converter="filterTypeConverter">
<f:selectItems var="checkbox"
value="#{requestBean.filterTypeBean.listBooleanFilterTypes()}"
itemLabel="#{checkbox.filterTypeName}" itemValue="#{checkbox}" />
</p:selectManyCheckbox>
RequestBean 类是@ViewScoped,在里面我有:
private FilterTypeBean filterTypeBean = new FilterTypeBean(); // Plus public get and set method for it
FilterType 类是@SessionScoped,我有:
private List<TFilterType> selectedBooleanFilterTypes; //plus public get and set methods
public List<TFilterType> listBooleanFilterTypes() {
EntityManager em = HibernateUtil.getEntityManager();
Query q = em
.createQuery("select u from TFilterType u where u.filterType = 'B'");
List<TFilterType> resultList = q.getResultList();
return resultList;
}
对我来说,一切似乎都很好,但是当我按下命令按钮时,即使我从 selectManyCheckbox 中选择了一些值,selectedBooleanFilterTypes 列表也是空的。我尝试使用 getSelectedBooleanFilterTypes() 方法获取 RequestBean 类中的值:
List<TFilterType> selectedBooleanFilterTypes = filterTypeBean
.getSelectedBooleanFilterTypes();
似乎 setSelectedFilterTypesNames() 没有执行。任何建议这里有什么问题以及如何解决它?提前致谢!
问: 转换器部分:
public Object getAsObject(FacesContext context, UIComponent component, String value) {
// It will create bean when not done yet.
FilterTypeBean filterTypeBean = context.getApplication().evaluateExpressionGet(context, "#{filterTypeBean}", FilterTypeBean.class);
for (TFilterType type : filterTypeBean.listBooleanFilterTypes()) {
if (type.getFilterTypeName().equals(value)) {
return type;
}
}
return null;
}
【问题讨论】:
-
首先将所有逻辑移出
listBooleanFilterTypes。 Don't do business logic in a getter。然后检查转换是否没有失败并且 setter 是否被调用 -
第一次加载时 SET 方法仍未执行,它给出了错误形式:
: Validation Error: Value is not valid。当我重新加载页面时,sett-er 设置了方法并且它可以工作,但我不明白为什么在重新启动服务器并运行应用程序后每次加载都会出现问题。 -
这个错误来自转换器,因为属性中的值为空。如何强制在页面第一次加载时设置值?如果我没有解释清楚,请问我!
-
您是否将逻辑移出
listBooleanFilterTypes? -
是的,但似乎问题是其他的。我刚刚调试它,我看到属性中有一个值,但是在第一次提交时编码不一样,它无法将它从 String 转换为 Object(在 getAsObject 方法中)并返回 NULL。有什么想法吗?
标签: java jsf primefaces selectmanycheckbox