Primefaces p:selectManyMenu选中选项后Bean中ArrayList长度为0求助
我来帮你一步步排查这个问题,勾选selectManyMenu后后端ArrayList长度为0的情况,通常是几个常见环节出了问题,我们逐个梳理:
检查Bean的作用域与集合类型
首先确认你的bReservarPistaBean的作用域:如果用的是@RequestScoped,每次请求都会重新创建Bean实例,之前勾选的选项自然会丢失。建议改成@ViewScoped——这是JSF页面保持状态的最佳实践,能让Bean和当前视图绑定,保留用户操作的状态。
另外,Bean里的集合属性和set方法尽量用List<HoraCheck>而非具体的ArrayList<HoraCheck>,因为JSF内部可能会使用不同的集合实现,指定具体实现类容易导致类型不匹配:// 将属性和set方法改为List类型 private List<HoraCheck> horasCheckMarcadas; public void setHorasCheckMarcadas(List<HoraCheck> horasCheckMarcadas) { this.horasCheckMarcadas = horasCheckMarcadas; }验证转换器的正确性
你的HoraCheckConverter是关键环节,这里可能存在几个隐患:- 在
getAsObject方法中,daohoraCheck.verHoraCheck(Integer.parseInt(value))是否真能从数据库查到对应的HoraCheck对象?如果查询返回null,这个选项就不会被加入集合。可以在这里加个日志,看看传入的value是不是正确的ID,以及查询结果是否不为空。 - 检查
getAsString方法:确保((HoraCheck)value).getIdHoraCheck()返回的是有效的非空ID,否则转换后的字符串为空,后端无法正确解析。 - 确认转换器注册和引用正确:虽然你用了
@FacesConverter("HoraCheckConverter"),但要保证组件上的converter="HoraCheckConverter"拼写完全一致,没有大小写错误。
- 在
检查HoraCheck类的equals和hashCode实现
JSF处理selectManyMenu时,会用equals方法对比选中对象和数据源中的对象。如果你的HoraCheck类没正确实现equals和hashCode(比如仅基于唯一标识idHoraCheck),哪怕转换器返回了正确对象,JSF也可能认为它和数据源里的对象不是同一个,导致无法加入选中集合。给你个参考实现:@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; HoraCheck horaCheck = (HoraCheck) o; return Objects.equals(idHoraCheck, horaCheck.idHoraCheck); } @Override public int hashCode() { return Objects.hash(idHoraCheck); }确认表单提交的处理逻辑
检查提交按钮的配置:- 如果用的是
<p:commandButton>,别设置process属性排除了manyHoras组件,最好把process设为@form,确保整个表单的组件都被处理:<p:commandButton value="提交" action="#{bReservarPista.submit}" process="@form" /> - 如果是普通的
<h:commandButton>,确保表单正确包裹了所有组件,没有嵌套错误。
- 如果用的是
添加调试日志排查
可以在setHorasCheckMarcadas方法里加日志,看看方法是否被调用,以及传入的集合是否为空:public void setHorasCheckMarcadas(List<HoraCheck> horasCheckMarcadas) { this.horasCheckMarcadas = horasCheckMarcadas; System.out.println("收到的选中集合长度:" + (horasCheckMarcadas != null ? horasCheckMarcadas.size() : 0)); }同时在转换器的
getAsObject和getAsString方法里也加日志,跟踪转换过程中的值是否正确。
内容的提问来源于stack exchange,提问作者tarita tanta

