Spring 3 MVC:在 MVC 控制器方法参数中公开会话范围的 bean

Posted

技术标签:

【中文标题】Spring 3 MVC:在 MVC 控制器方法参数中公开会话范围的 bean【英文标题】:Spring 3 MVC: Expose session scoped bean in MVC Controller method arguments 【发布时间】:2012-11-07 19:02:08 【问题描述】:

我想在我的控制器周围传递一个会话范围的域 bean,以保持一致性和简单性 - 但这似乎不可能 OOTB。希望有人能给点建议。

问题:可以将会话范围的 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";
         
   

“客户”会话 bean 是一个常规 POJO,使用 XML 配置的 aop-proxy (CGLIB) 允许将会话范围的 bean 注入到单例(控制器和服务类)中:

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

以下问题几乎相同,但没有不涉及扩展 Spring 3 核心框架的答案。

Spring 的设计者是否有意省略了这一点?我的意图是使用域模型来支持表单,而不使用“表单 bean”和一层映射器。

任何人都可以建议一种方法/或指出这是否是不好的做法吗?

定制解决方案的先前问题:

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

请注意:尽量减少对 Spring 框架的依赖并使用 Annotation 支持 esp JSR-303 等。将采用任何 OOTB 解决方案 - 请不要建议自定义扩展。

【问题讨论】:

【参考方案1】:

Spring-MVC 可以将应用程序上下文的 bean 暴露给视图层,如果您希望这样做的话。

例如,可以指示 InternalResourceViewResolver 公开上下文中的每个 bean,或者只公开指定的 bean。查看exposeContextBeansAsAttributes 和exposedContextBeanNames 属性。

例如,假设您想将 bean 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>

【讨论】:

以上是关于Spring 3 MVC:在 MVC 控制器方法参数中公开会话范围的 bean的主要内容,如果未能解决你的问题,请参考以下文章

(04)Spring MVC之Get方式传参访问Controller,从Controller返回json串出现菱形问号(?????)乱码,解决方法。

在 Spring MVC 3.1 控制器的处理程序方法中直接流到响应输出流

Spring 3 MVC Controller 集成测试 - 将 Principal 注入方法

Spring 3 MVC 从控制器访问 HttpRequest

Spring MVC POJO传参方式

在 Spring MVC 中映射 Ajax 请求:不允许出现错误 405 方法