Spring хранить объект в сеансе

Я хотел бы реализовать корзину с Spring, поэтому мне нужно сохранить объект Cart (который имеет атрибуты, такие как products, paymentType и deliveryType) в сеансе. Я попытался создать его с bean и атрибутом "scope", установленным в "session", но он просто не работает, следует ли использовать некоторые дополнительные аннотации в моем контроллере или классе Cart? Любое использование примера было бы очень полезно:-) Спасибо заранее.

Ответ 1

@Component
@Scope("session")
public class Cart { .. }

а затем

@Inject
private Cart cart;

должен работать, если он объявлен в веб-контексте (dispatcher-servlet.xml). Альтернативный вариант - использовать сырой сеанс и разместить там свой объект:

@RequestMapping(..)
public String someControllerMethod(HttpSession session) {
    session.addAttribute(Constants.CART, new Cart();
    ...
    Cart cart = (Cart) session.getAttribute(Constants.CART);
}

Ответ 2

Если вы вводите корзину покупок прямо в ваш контроллер, проблема, скорее всего, происходит из-за того, что ваш контроллер имеет одинаковую область (по умолчанию), которая является более широкой областью, чем bean, которую вы вводите. В этой замечательной статье приведен обзор четырех подходов к тому, что вы пытаетесь сделать: http://richardchesterwood.blogspot.co.uk/2011/03/using-sessions-in-spring-mvc-including.html.

Вот краткое изложение решений:

  • Объедините контроллер в область сеанса (используйте @scope("session") на уровне контроллера) и просто получите экземпляр корзины покупок в контроллере.
  • Скомпонуйте контроллер, чтобы запросить и введите в него загруженную телеграмму.
  • Просто используйте сессию напрямую - вроде беспорядочно, ИМО.
  • Используйте Spring аннотацию <aop:scoped-proxy/>.

Все методы имеют свои плюсы и минусы. Обычно я использую вариант 2 или 4. Вариант 4 на самом деле довольно прост и является единственным подходом, который я видел задокументированным Spring.

Ответ 3

Вам просто нужно добавить аннотацию 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 и бутстрап, которые демонстрируют spring Область сеанса -
https://github.com/dpaani/springmvc-shoppingcart-sample