我有一个过滤器,它在 Faces Servlet 之前映射并在 HttpSession 中填充一些属性,然后再继续请求
if (_clientUser != null && !_clientUser.isEmpty()) {
session.setAttribute(CLIENT_USER_URI_PARAM_NAME, _clientUser);
filterChain.doFilter(servletRequest, servletResponse);
return;
}
在 URI 中,有一些信息应针对哪些任务流进行处理
faces/adf.task-flow?adf.tfId=task-flow-definition-id&adf.tfDoc=/WEB-INF/task-flow-definition-id.xml
在我继续请求之后,有界任务流中有一个方法调用,在视图之前调用(让我们调用视图 MainPage),使其成为默认活动
<default-activity>doStuff</default-activity>
方法本身位于 PageFlowScoped Managed Bean 中,该 Bean 添加到 task-flow-definition-id.xml
这是在“MainPage”-View 之前调用的 doStuff 方法
public class Controller{
public void doStuff {
FacesContext ctx = FacesContext.getCurrentInstance();
Map sessionMap = ctx.getExternalContext().getSessionMap();
String clientUser = (String) sessionMap.get(CLIENT_USER_URI_PARAM_NAME);
AppModImpl am = getApplicationModule();
DBTransaction transaction = am.getDBTransaction();
//do more stuff
}
}
public AppModImpl getApplicationModule() {
FacesContext fc = FacesContext.getCurrentInstance();
Application app = fc.getApplication();
ExpressionFactory elFactory = app.getExpressionFactory();
ELContext elContext = fc.getELContext();
ValueExpression valueExp =
elFactory.createValueExpression(elContext, "#{data.AppModDataControl.dataProvider}", Object.class);
AppModImpl am = (AppModImpl) valueExp.getValue(elContext);
return am;
}
直到这里一切正常。但是,如果我尝试获取应用程序模块。有非。此应用程序通常没有任何 DataControl,因为它只是一个根应用程序,其中包含 ADFLibrarys 添加的不同组件,但我在 DataBindings.cpx 中添加了一个 DataControl,在 MainPagePageDef 中添加了一个迭代器(只是为了在绑定)但仍然没有结果。
您对我如何访问应用程序模块有什么建议吗?在调用托管 Bean 时,FacesServlet 应该已经创建了必要的 FacesContext,还是仅在实际页面(jspx/jsf)加载时创建一个新的 FacesContext?