会话中的Spring存储对象

时间:2012-04-05 19:45:00

标签: java spring servlets spring-mvc

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

4 个答案:

答案 0 :(得分:33)

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

答案 1 :(得分:13)

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

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

  1. 将控制器范围扩展到会话范围(在控制器级别使用@scope("session")),并在控制器中只有一个购物车实例。
  2. 范围控制器请求并注入会话范围的购物车。
  3. 直接使用会话 - 有点乱,IMO。
  4. 使用Spring的注释<aop:scoped-proxy/>
  5. 所有方法都有其优点和缺点。我通常使用选项2或4.选项4实际上非常简单,是我见过的唯一方法documented by Spring.

答案 2 :(得分:2)

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

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

您需要使用购物车对象时,可以自动装载

@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

答案 3 :(得分:0)

尝试自动连接HttpSession,spring将注入代理到HttpSession @Autowired private HttpSession httpSession;