2012-11-07 64 views
3

爲了一致性和簡單性,我想在我的控制器周圍傳遞一個會話作用域bean bean,但這似乎不可能OOTB。希望有人能提供建議。Spring 3 MVC:在MVC Controller方法參數中公開會話作用域bean

問:能會話作用域的bean公開爲MVC控制器參數


似乎有此註釋:@SessionAttributes(「爲myBean」)然而,這僅保留控制器級別的範圍。

我正在尋求避免與HttpSession進行交互,而是通過我的控制器一直傳遞我的域對象圖。這似乎是一個相當標準的要求。

這有優點:

  • 可測性 - 只是注入bean來測試,而不必模擬出的HttpSession
  • 抽象 - 避免的Servlet模型的關注,只是業務問題

這裏的當前配置:

@Controller 
@SessionAttributes("customer") 
public class LoginController { 

    @Inject Customer customer; 

    @RequestMapping(value = "/login", method = RequestMethod.GET) 
    public String welcome(Customer customer) { 
     ... 
     return "loginDetailsView"; 
    } 

    public String processLogin(@Valid Customer customer, BindingResult bindingResult) { 
     ... 
     if (bindResult.hasErrors()) { 
      return "loginDetailsView"; 
     else { 
      return "homePageView"; 
     } 
    } 

'客戶' 會議是一個是使用XML常規POJO配置AOP-代理(CGLIB),以允許會話作用域bean被注入到單身(控制器和服務類):

<beans:bean id="customer" class="com.mypackage.domain.Customer" scope="session"> 
      <aop:scoped-proxy proxy-target-class="true"/> 
</beans:bean> 

以下問題是幾乎相同的,但沒有這些答案不涉及對Spring 3核心框架的擴展。

這是故意忽略了春天的設計師?我的意圖是使用域模型來支持表單而不使用「表單bean」和一個映射器層。

任何人都可以建議一種方式/或指出這是否是不好的做法?

提供量身定製的解決方案之前的問題:

How to pass a session attribute as method argument (parameter) with Spring MVC

請注意:試圖儘量減少對Spring框架的依賴和使用註釋支持ESP JSR-303等,將採取任何開箱即用的解決方案 - 請不要」 t建議自定義擴展。

回答

0

Spring-MVC可以將應用程序上下文的bean暴露給視圖層,如果這是你想要做的。

例如,可以指示InternalResourceViewResolver公開上下文中的每個bean,或僅指定一個。看看exposeContextBeansAsAttributesexposedContextBeanNames屬性。

例如,假設您想將beans beanA和beanB展示給您的JSP。另外

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="exposedContextBeanNames"> 
     <list> 
     <value>beanA</value> 
     <value>beanB</value> 
     </list> 
    </property> 
</bean> 

,只是揭露每個bean:你會在你的情況下這樣聲明的視圖解析

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="exposeContextBeansAsAttributes" value="true"/> 
</bean> 
相關問題