2014-02-13 67 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是我所需要的。謝謝。 –