0

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

我已经将一些 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)

在这一点上的任何帮助将不胜感激。

4

1 回答 1

0

It looks like you are trying to (ab)use a scope for which it was not directly meant to be used. Using the Deltaspike @WindowScoped is what you should use. It creates a scope per browser window or tab

于 2018-11-08T09:23:49.847 回答