Вопрос по spring, java – Spring store object in session

28

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

Ваш Ответ

3   ответа
31
@Component
@Scope("session")
public class Cart { .. }

а потом

@Inject
private Cart cart;

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

@RequestMapping(..)
public String someControllerMethod(HttpSession session) {
    session.setAttribute(Constants.CART, new Cart());
    ...
    Cart cart = (Cart) session.getAttribute(Constants.CART);
}
нет. в dispatcher-servlet.xml. Или, как я показал - заявлено с аннотациями
Хм, но когда я использую аннотации, без определения bean-компонента в dispatcher-servlet.xml, я получаю ошибку, которую вставляю раньше, плюс, когда я использую аннотации и определяю bean-компонент, я получаю 404 только с этим контроллером. tomaszf
@ Божо - это будет работать, если у нас есть несколько товаров в корзине? вот мой вопросlink
аннотации должны быть объединены с & lt; context: component-scan / & gt ;. Но XML тоже хорошо
Да, «альтернативный вариант» работает, но я не хочу его использовать. Когда я создаю корзину закрытых атрибутов в моем контроллере, я получаю сообщение об ошибке "Не найден соответствующий компонент для зависимости: ожидается как минимум 1 компонент, который квалифицируется как кандидат для автоматического подключения для этой зависимости. Аннотации зависимостей: {@ org.springframework.beans.factory.annotation.Autowired (обязательно = true)} & quot ;. Бин должен быть определен в applicationContext.xml как & lt; bean id = & quot; cart & quot; класс = & Quot; Корзина & Quot; Объем = & Quot; сеанс & Quot; / & GT ;? tomaszf
13

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

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

Scope the controller to session scope (use @scope("session") on controller level) and just have a shopping cart instance in the controller. Scope the controller to request and have session-scoped shopping cart injected. Just use the session directly - kind of messy, IMO. Use Spring's annotation <aop:scoped-proxy/>.

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

Правильный URLrichardchesterwood.blogspot.co.uk/2011/03/…
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
2

как показано ниже, в режиме сеанса и прокси

@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

Похожие вопросы