跨页面方法传参调用ViewCriteria按部门ID筛选员工不生效问题
ADF有界任务流跨页按部门ID筛选员工数据失效修复方案
问题场景
在部门、员工两个页面的有界任务流中通过方法调用传参,实现员工数据按departmentId筛选的功能:
- 员工视图已创建基于绑定变量
vcDeptId的筛选视图条件,对应视图对象实现代码:
public void applyViewCriteria(int id) { ViewCriteria vc = getViewCriteria("EmployeesViewFilterByDeptCriteria"); setvcDepartmentId(id); applyViewCriteria(vc); executeQuery(); }
- 部门页面为表格配置了触发方法调用的跳转按钮,对应方法实现代码:
public void filter() { BindingContext bindingContext = BindingContext.getCurrent(); DCDataControl dc = bindingContext.findDataControl("AppModuleDataControl"); AppModuleImpl appM = (AppModuleImpl )dc.getDataProvider(); Object id =appM.getDepartmentsView1().getCurrentRow().getAttribute("DepartmentId"); appM.getEmployeesView2().applyViewCriteria(Integer.parseInt(id.toString())); System.err.println(id); }
运行时控制台可正确打印选中的部门ID,但跳转至员工页面后表格筛选未生效,展示全量员工数据。
根因说明
问题核心是直接操作数据模型的逻辑绕过了ADF绑定层生命周期,执行的筛选结果被后续页面渲染阶段的默认查询覆盖,具体触发点包括:
- 直接通过
dc.getDataProvider()获取AppModule实例操作视图对象,要么操作的视图对象实例和员工页实际渲染绑定的实例不是同一个,要么方法执行时机早于页面初始化阶段的框架默认查询,筛选后的结果被全量查询重置。 - 应用视图条件时未设置持久生效标记,框架刷新查询时会自动丢弃临时应用的筛选条件。
- 有界任务流默认使用隔离的数据控制帧配置,跨页面操作的数据上下文不共享。
修复步骤
按以下顺序调整即可解决问题:
- 禁止直接通过
getDataProvider()拿AppModule实例操作视图对象,将applyViewCriteria方法加入视图对象的客户端接口,通过页面绑定层的方法绑定触发调用,保证筛选逻辑在ADF生命周期的正确阶段执行。 - 检查有界任务流的
data-control-scope配置,若两个页面在同一个有界任务流内,将配置修改为shared,保证两个页面对应的视图对象实例为同一个。 - 修改
applyViewCriteria方法,应用视图条件时指定永久生效标记,同时清空历史条件避免叠加,调整后代码如下:
public void applyViewCriteria(int id) { // 清空已有视图条件,避免条件叠加导致结果异常 getViewCriteriaManager().clearAllViewCriterias(); ViewCriteria vc = getViewCriteria("EmployeesViewFilterByDeptCriteria"); setvcDepartmentId(id); // 第二个参数传true,标记视图条件在后续查询中持续生效,不会被框架自动清空 applyViewCriteria(vc, true); executeQuery(); }
- 检查员工页面对应的员工表格迭代器配置,关闭
Refresh After Insert、Refresh on Transaction Active这类会触发初始化全量查询的刷新选项,也可将迭代器的RefreshCondition设置为#{!bindings.EmployeesViewIterator.estimatedRowCount > 0},避免页面加载时重新执行无筛选条件的查询。 - 若两个页面分属不同的有界任务流,不要通过直接操作AppModule传参,改为在任务流导航规则中配置
departmentId为传递参数,员工页加载时通过页面传入的参数调用筛选方法,调用逻辑放在任务流的方法调用活动或者页面的beforePhase监听器中,保证在表格渲染前完成筛选执行。
调试技巧:在
applyViewCriteria方法和视图对象的executeQuery方法上加断点,跳转员工页后观察执行顺序,如果筛选方法执行完后又触发了无参数的executeQuery,就说明是框架生命周期的默认查询覆盖了筛选结果,按上述迭代器配置调整即可。
内容的提问来源于stack exchange,提问作者Zavina
相关产品推荐
相关产品推荐

