会话中的Spring存储对象

我想用Spring实现一个购物车,所以我需要在会话中保存一个对象Cart (它有像products,paymentType和deliveryType这样的属性)。 我试图用bean创建它,并将属性“scope”设置为“session”,但它只是不起作用,我应该在我的控制器或Cart类中使用一些额外的注释吗? 任何使用示例都非常有用:-)在此先感谢。

 @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); } 

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

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

  1. 将控制器扩展到会话范围(在控制器级别使用@scope("session") )并在控制器中只有一个购物车实例。
  2. 控制器的范围请求并注入会话范围的购物车。
  3. 只是直接使用会话 – 有点混乱,IMO。
  4. 使用Spring的注释

所有这些方法各有利弊。 我通常使用选项2或4.选项4实际上非常简单,并且是我在Spring中记录的唯一方法。

您只需要在会话和代理模式下添加Scope注释,如下所示

 @Component @Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS) public class ShoppingCart implements Serializable{ } 

您需要使用购物车对象,您可以自动assembly它

 @Service public class ShoppingCartServiceImpl implements ShoppingCartService { Logger logger = LoggerFactory.getLogger(ShoppingCartServiceImpl.class); @Autowired ShoppingCart shoppingCart; } 

披露:我开发了一个示例项目,它使用spring MVC,angularJS和bootstrap来演示Spring Session范围 –
https://github.com/dpaani/springmvc-shoppingcart-sample