【问题标题】:Integrating Spring request scope with JSF controllers将 Spring 请求范围与 JSF 控制器集成
【发布时间】:2014-03-12 10:18:59
【问题描述】:

我正在开发一个混合使用 JSF 和 Spring-MVC 的项目。用户界面端点通过 JSF 前端控制器 (javax.faces.webapp.FacesServlet) 访问,而 REST 服务调用通过 Spring-MVC 前端控制器 (org.springframework.web.servlet.DispatcherServlet) 访问。更深层由 Spring 管理(或多或少)。我不喜欢这种安排,但我无法改变它。

问题是在处理通过 JSF 前端控制器传入的请求时,Spring 的请求范围 bean 没有被初始化。是否有现成的解决方案将 Spring 的 WebApplicationContext 与 JSF 机制集成,以便为每个请求初始化 Spring 请求范围的 bean,无论该请求是通过 JSF 还是 Spring servlet 来的?

【问题讨论】:

    标签: spring jsf spring-mvc


    【解决方案1】:

    有两种方法可以将 JSF 与 Spring 集成,具体取决于您希望对哪个框架给予最大控制:

    JSF 前端控制器: 一种方法是通过 JSF faces servlet 路由所有请求,让 JSF 将它们路由到控制器,让 JSF 通过 faces-config 管理导航状态。然后将 spring bean 注入到 JSF 托管 bean 中,并通过 SpringBeanFacesELResolver 使用值表达式从 facelets 视图访问 spring bean。

    查看此帖子以获取working example。

    Spring 前端控制器: 将 spring 作为前端控制器与调度程序 servlet 并放置 spring webflow。这是集成两个框架的首选和最强大的方法,请参阅documentation 的这一部分。

    Spring webflow 将管理导航状态,并且 faces 配置文件大部分是空的。不需要JSF托管bean层,请求直接由webflow处理。

    JSF 按钮中的动作直接触发 webflow 转换,也可以在值表达式中使用 spring bean 来构建视图。有了这个解决方案,与 Spring 的集成更加无缝,因为 webflow 提供了比 JSF 导航机制更多的可能性:在转换之间触发 bean 方法,后重定向获取模式以避免重复提交。

    也就是说,spring request 作用域 bean 的初始化问题通过这个方向解决了,尽管另一种方法是在 web.xml 中添加一个 RequestContextListener 或一个 RequestContextFilter(参见3.4.4.1 of the docs 部分)。

    【讨论】:

    • 由于我无法控制的原因,我陷入了第一种情况:使用 JSF 前端控制器。我知道在这种情况下我可以使用 SpringBeanFacesELResolver 来检索单例或原型范围的 Spring bean。我的问题是,由于我绕过了 Spring DispatcherServlet,请求或会话范围的 Spring bean 会被正确初始化吗?这就是我需要解决的问题。
    • 更深入地挖掘您的建议,看起来您指向我的 RequestContextListener 可能就是我想要的。
    • 是的。 RequestContextListener 是我需要的。谢谢。
    猜你喜欢
    • 2011-08-15
    • 1970-01-01
    • 2011-02-18
    • 2015-09-13
    • 2012-03-06
    • 2011-11-11
    • 2012-05-24
    • 1970-01-01
    • 2012-07-25
    相关资源
    最近更新 更多