【发布时间】: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 解决方案 - 请不要建议自定义扩展。
【问题讨论】:
标签: java spring model-view-controller controller session-bean