会话中的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 。
以下是解决方案的快速摘要:
- 将控制器扩展到会话范围(在控制器级别使用
@scope("session")
)并在控制器中只有一个购物车实例。 - 控制器的范围请求并注入会话范围的购物车。
- 只是直接使用会话 – 有点混乱,IMO。
- 使用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