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