Primefaces中使用FacesConverter后actionListener无法触发求助
问题:p:selectManyCheckbox添加转换器后actionListener方法不执行
我用PrimeFaces开发表单,需要将<p:selectManyCheckbox>的选中值传递到Bean的List<ModelObj>中,调用方法对选中项执行逻辑处理。原本方法可正常调用,但选中值是模型属性的字符串而非模型对象本身。
于是实现了一个FacesConverter,通过ID从DAO中获取对应对象,转换器本身运行正常,但添加converter="myConverter"后,处理逻辑的downloadFiles()方法就不再被调用。移除转换器后,方法又能正常执行,不知如何进一步排查。
前端代码
<h:form> <h:panelGroup id="contentDefault" layout="block"> <p:selectManyCheckbox value="#{backBean.selectedList}" columns="1" layout="grid" converter="myConverter"> <f:selectItems value="#{backBean.selectionList}" var="file" itemLabel="#{file.name}" itemValue="#{file}" /> </p:selectManyCheckbox> <p:panelGrid id="bottomDefault" layout="grid" columns="1" columnClasses="text_center"> <p:commandButton value="Download" icon="pi pi-download" process="contentDefault" partialSubmit="true" actionListener="#{backBean.downloadFiles()}"> <p:confirm type="popup" header="Confirm" message="Download the files?" icon="pi pi-exclamation-triangle" /> </p:commandButton> </p:panelGrid> </h:panelGroup> </h:form>
Back Bean代码
@ManagedBean(name = "backBean") @ViewScoped public class BackBean implements Serializable { private List<ModelObj> selectionList; private List<ModelObj> selectedList; private ModelObjDAO modelObjDAO; public void downloadFiles() { for (ModelObj file : selectedList) { file.getNome(); } } public List<ModelObj> getSelectionList() { return selectionList; } public void setSelectionList(List<ModelObj> selectionList) { this.selectionList = selectionList; } public List<Object> getSelectedList() { if (selectedList == null) { selectedList = new ArrayList<>(); } return selectedList; } public void setSelectedList(List<ModelObj> selectedList) { this.selectedList = selectedList; } }
排查与解决步骤
1. 修复Bean中getSelectedList的返回类型错误
你的Bean代码中,getSelectedList()返回List<Object>,但实际selectedList是List<ModelObj>。这种类型不匹配会导致JSF在转换后赋值时触发验证失败,直接跳过actionListener的执行。
修改为正确的返回类型:
public List<ModelObj> getSelectedList() { if (selectedList == null) { selectedList = new ArrayList<>(); } return selectedList; }
2. 检查转换器getAsObject方法的返回类型
确保转换器的getAsObject方法返回严格的ModelObj类型,如果返回类型不匹配,JSF会在值绑定阶段抛出异常,中断后续流程。
3. 验证转换器getAsString方法的可靠性
确保getAsString方法返回的是ModelObj的唯一标识(比如ID),且不会抛出空指针异常。该方法若出错,同样会导致JSF处理流程中断。
4. 开启JSF开发日志定位问题
在web.xml中添加以下配置,开启开发阶段的详细日志,查看转换过程中是否有异常抛出:
<context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> </context-param> <context-param> <param-name>javax.faces.LOGGER_LEVEL</param-name> <param-value>FINE</param-value> </context-param>
内容的提问来源于stack exchange,提问作者lzzgabriel
相关产品推荐
相关产品推荐

