28

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

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

  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Да, «альтернативный вариант» работает, но я не хочу его использовать. Когда я создаю корзину закрытых атрибутов в моем контроллере, я получаю сообщение об ошибке "Не найден соответствующий компонент для зависимости: ожидается как минимум 1 компонент, который квалифицируется как кандидат для автоматического подключения для этой зависимости. Аннотации зависимостей: {@ org.springframework.beans.factory.annotation.Autowired (обязательно = true)} & quot ;. Бин должен быть определен в applicationContext.xml как & lt; bean id = & quot; cart & quot; класс = & Quot; Корзина & Quot; Объем = & Quot; сеанс & Quot; / & GT ;?

    от tomaszf
  • Правильный URLrichardchesterwood.blogspot.co.uk/2011/03/…

    от
  • аннотации должны быть объединены с & lt; context: component-scan / & gt ;. Но XML тоже хорошо

    от
  • Хм, но когда я использую аннотации, без определения bean-компонента в dispatcher-servlet.xml, я получаю ошибку, которую вставляю раньше, плюс, когда я использую аннотации и определяю bean-компонент, я получаю 404 только с этим контроллером.

    от tomaszf
  • @ Божо - это будет работать, если у нас есть несколько товаров в корзине? вот мой вопросlink

    от
  • нет. в dispatcher-servlet.xml. Или, как я показал - заявлено с аннотациями

    от
  • 31

    а потом @Inject private Cart cart;

    @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);
    }
    

  • 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.

  • 2

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