2014-02-13 44 views
1

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

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

回答

1

有两种方法来JSF与Spring集成,这取决于你想给多数控制其框架:

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

看到这个职位的working example

弹簧前端控制器:将弹簧作为带有调度器servlet的前端控制器,并将弹簧webflow放置到位。这是整合这两个框架的首选和最强大的方法,请参阅documentation的这一部分。

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

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

Namelly弹簧请求作用域bean的初始化问题是用这个方向解决的,尽管替代方法是在web.xml中添加RequestContextListener或RequestContextFilter(请参阅3.4.4.1 of the docs一节)。

+0

由于我不能控制的原因,我陷入了第一种情况:使用JSF前端控制器。我知道在这种情况下,我可以使用SpringBeanFacesELResolver来检索单例或原型范围的Spring bean。我的问题是,由于我绕过了Spring DispatcherServlet,请求或会话范围的Spring bean是否被正确初始化?这是我需要解决的问题。 –

+0

深入挖掘你的建议,它看起来像你指向我的RequestContextListener可能是我正在寻找的东西。 –

+0

是的。 RequestContextListener是我所需要的。谢谢。 –