Java 会话中的Spring存储对象
我想用Spring实现一个购物车,所以我需要在会话中保存一个对象Java 会话中的Spring存储对象,java,spring,servlets,spring-mvc,Java,Spring,Servlets,Spring Mvc,我想用Spring实现一个购物车,所以我需要在会话中保存一个对象cart(它有products、paymentType和deliveryType等属性)。我曾尝试将bean和属性“scope”设置为“session”来创建它,但它就是不起作用,我应该在控制器或Cart类中使用一些附加注释吗?任何示例用法都会非常有用:-)提前谢谢 @Component @Scope("session") public class Cart { .. } 然后 @Inject private Cart cart;
cart
(它有products、paymentType和deliveryType等属性)。我曾尝试将bean和属性“scope”设置为“session”来创建它,但它就是不起作用,我应该在控制器或Cart
类中使用一些附加注释吗?任何示例用法都会非常有用:-)提前谢谢
@Component
@Scope("session")
public class Cart { .. }
然后
@Inject
private Cart cart;
如果它是在web上下文(dispatcherservlet.xml)中声明的,则应该可以工作。另一种选择是使用原始会话并将购物车对象放在那里:
@RequestMapping(..)
public String someControllerMethod(HttpSession session) {
session.setAttribute(Constants.CART, new Cart());
...
Cart cart = (Cart) session.getAttribute(Constants.CART);
}
如果您将购物车直接注入到控制器中,那么问题很可能会发生,因为您的控制器是单例范围的(默认情况下),这比您注入的bean的范围更广。这篇优秀的文章提供了四种方法的概述,这些方法正是您想要做的 以下是解决方案的简要总结:
@Scope(“session”)
),只需在控制器中设置一个购物车实例您只需添加作用域注释,如下所示,使用会话和代理模式即可
@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;
}
披露:我开发了一个示例项目,它使用SpringMVC、angularJS和bootstrap来演示spring会话范围-
尝试自动连接HttpSession,spring将向HttpSession注入代理
@自动连线
私有HttpSession HttpSession;
是的,“替代选项”起作用,但我不想使用它。当我在控制器中创建私有属性购物车时,我得到一个错误,即“找不到与依赖项匹配的bean:至少需要1个符合此依赖项autowire候选项条件的bean。依赖项批注:{@org.springframework.beans.factory.annotation.Autowired(required=true)}”。bean应该在applicationContext.xml中定义为?no.在dispatcher-servlet.xml中。或者,如我所示,用annotationsHmm声明,但是当我使用注释时,如果dispatcher-servlet.xml中没有bean定义,我会得到我之前粘贴的错误,另外,当我使用注释并定义bean时,我只会用该控制器得到404。注释s应该与.结合,但xml也是fine@Bozho-如果购物车中有多个项目,这是否有效?我的问题是,正确的URL是注意,在解决方案#4中,不要在任何方法上使用final。这样做,访问者将是单例的,而不是会话范围的,因为AOP无法拦截final。