JSF FlowScoped直接入口点

时间:2018-11-07 22:01:49

标签: jsf navigation cdi flow-scope

对不起,如果有人问过这个问题,但我找不到答案。

我已经将一些spring bean转换为cdi @Named并将范围设置为FlowScoped。我这样做是为了解决会话范围的Bean在多个选项卡之间共享并在先前打开的选项卡中破坏应用程序的问题。

我已经部分工作了,但是我遇到了FlowScoped bean入口点的问题。

我发现的所有示例都使用带有按钮的页面,此按钮具有可导航到流入口点的操作(我创建了一个空白bean-flow.xml文件)。有没有办法直接从链接或从面孔重定向输入流作用域?我有点需要这样做有两个原因。也许还有其他解决方法?我使用spring security进行登录,并使用default-target-url="/search/search.xhtml"进行设置。我已经通过创建另一个页面并仅使用以下内容在加载时进行重定向来解决此问题

        ConfigurableNavigationHandler configurableNavigationHandler =
            (ConfigurableNavigationHandler) FacesContext.getCurrentInstance()
                .getApplication().getNavigationHandler();

    configurableNavigationHandler.performNavigation("search");

以上方法有效,但以下方法无效

FacesContext.getCurrentInstance().getExternalContext().redirect("/search/search.xhtml");

理想情况下,我还希望能够直接在地址栏中输入

http://localhost:8080/searchApp/search/search.xhtml?searchcriteria=somecriteria

当我这样做或人脸重定向时,我会得到一个错误

javax.servlet.ServletException: WebBeans context with scope type annotation @FlowScoped does not exist within current thread
javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.apache.openejb.server.httpd.EEFilter.doFilter(EEFilter.java:65)

任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:0)

您似乎正在尝试(ab)使用一个不是直接要使用的范围。应该使用Deltaspike @WindowScoped。它为每个浏览器窗口或选项卡

创建一个范围