会话中的弹簧存储对象

2022-09-01 02:31:24

我想用Spring实现购物车,所以我需要在会话中保存一个对象(具有产品,付款类型和交付类型等属性)。我试图在bean和属性“scope”设置为“session”的情况下创建它,但它不起作用,我应该在我的控制器或类中使用一些额外的注释吗?任何示例用法都会非常有帮助:-)提前致谢。CartCart


答案 1
@Component
@Scope("session")
public class Cart { .. }

然后

@Inject
private Cart cart;

应该在 Web 上下文中声明它(dispatcher-servlet.xml)。另一种选择是使用原始会话并将购物车对象放在那里:

@RequestMapping(..)
public String someControllerMethod(HttpSession session) {
    session.setAttribute(Constants.CART, new Cart());
    ...
    Cart cart = (Cart) session.getAttribute(Constants.CART);
}

答案 2

如果您将购物车直接注入控制器,则可能会发生此问题,因为您的控制器是单例范围的(默认情况下),其范围比您注入的Bean更宽。这篇优秀的文章概述了您正在尝试做的四种方法:http://richardchesterwood.blogspot.co.uk/2011/03/using-sessions-in-spring-mvc-including.html

以下是解决方案的快速摘要:

  1. 将控制器的作用域限定为会话作用域(在控制器级别使用),并且控制器中只有一个购物车实例。@scope("session")
  2. 限定控制器的范围以请求并注入会话范围的购物车。
  3. 只需直接使用会话 - 有点混乱,IMO。
  4. 使用弹簧的注释。<aop:scoped-proxy/>

所有方法都有其优点和缺点。我通常选择选项2或4。选项4实际上非常简单,是我看到的Spring记录的唯一方法。


推荐