1

我在 jsf-icefaces 应用程序中集成了一个 flex 应用程序(在带有 ice:outputmedia-tag 的 jspx 站点中),并希望通过远程从 flex 访问 jsf 注入的同一 bean 实例。

我已经将 blazeds 连接到了一个 java-bean。这个bean - 像所有其他bean一样 - 通过注入jsf来获取其他bean,但是当我通过flex远程访问bean时,它不会保存注入的bean(如localizer和accesmanager,都是会话范围的)并且我无法连接到jsf 会话(FacesContext.getCurrentInstance() 为空)。这是因为 flex 创建了一个新的 bean 实例,我认为它与 jsf 注入的当前实例不同。

我可以通过在 java bean 中创建一个新的实体管理器从 flex 连接到数据库,但这不是我想要的,因为它又是另一个实体管理器......我想通过 accessmanager-bean 持久化并获取数据。

我知道 exadel fiji 和 flamingo,但我无法使用 fiji,因为我的 jsf 应用程序包含 icefaces 组件,然后它不适用于 fiji 需要的richfaces。和 flamingo 仅适用于 jboss seam 和 spring。这样对吗?

我还阅读了 spring-flex-integration,但是 jsf 应用程序没有使用 spring 创建,我不想将 spring 集成到这么大的 jsf 应用程序中。昨天我阅读了有关 FlexFactory 界面的信息。这个接口我必须在我自己的工厂中实现,并将其设置在 blazeds 的 service-config.xml 中,因为工厂读取了这个。我仍然实现自己的工厂,但我只能通过 servlet 上下文获取应用程序范围的 bean,而我通过 FlexContext.getServletContext().getAttribute("Bean"); 而不是会话范围的bean...

我希望有机会连接 throw flex 和 jsf ...谢谢!

4

1 回答 1

1

FacesContext.getCurrentInstance() 为空

这只会在当前请求通过FacesServlet. 换句话说,请求 URLurl-patternFacesServlet. 它就是负责创建线程本地FacesContext实例的人。

但你实际上并不需要FacesContext这里。由于 JSF 只是在 Servlet API 的顶部运行,因此您也可以进入低级别并利用它来获取会话范围的托管 bean。JSF 将会话范围的托管 bean 存储为 的属性,HttpSession托管 bean 名称作为键。

因此,例如,如果您有一个具有托管 bean 名称的会话范围的托管 bean,myBean并且您拥有它HttpServletRequest,那么您还可以按如下方式访问它:

MyBean myBean = (MyBean) request.getSession().getAttribute("myBean");
于 2010-01-25T11:51:47.900 回答