Java 会话中的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;

我想用Spring实现一个购物车,所以我需要在会话中保存一个对象
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”)
    ),只需在控制器中设置一个购物车实例
  • 将控制器的作用域设置为请求,并将会话作用域的购物车注入
  • 直接使用会话-有点混乱,依我看

  • 使用Spring的注释

    您只需添加作用域注释,如下所示,使用会话和代理模式即可

    @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。