我想用Spring实现购物车,所以我需要在会话中保存一个对象Cart
(其中包含product,paymentType和deliveryType等属性)。我试图用bean创建它,并将属性“scope”设置为“session”,但它只是不起作用,我应该在我的控制器或Cart
类中使用一些额外的注释吗?任何使用示例都非常有用:-)在此先感谢。
答案 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。
以下是解决方案的快速摘要:
@scope("session")
),并在控制器中只有一个购物车实例。<aop:scoped-proxy/>
。 所有方法都有其优点和缺点。我通常使用选项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;