web-dev-qa-db-fra.com

Objet Spring store en session

Je voudrais implémenter un panier d'achat avec Spring, donc je dois enregistrer un objet Cart (qui a des attributs comme products, paymentType et deliveryType) en session. J'ai essayé de le créer avec le bean et l'attribut "scope" défini sur "session", mais cela ne fonctionne tout simplement pas, dois-je utiliser des annotations supplémentaires dans mon contrôleur ou dans la classe Cart? Tout exemple d'utilisation serait vraiment utile :-) Merci d'avance.

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

puis

@Inject
private Cart cart;

devrait fonctionner, s'il est déclaré dans le contexte Web (dispatcher-servlet.xml). Une autre option consiste à utiliser la session brute et à y placer votre objet panier:

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

Si vous injectez le panier directement dans votre contrôleur, le problème se produit probablement parce que votre contrôleur a une portée unique (par défaut), ce qui est plus large que le bean que vous injectez. Cet excellent article donne un aperçu de quatre approches pour exactement ce que vous essayez de faire: http://richardchesterwood.blogspot.co.uk/2011/03/using-sessions-in-spring-mvc-including .html .

Voici un bref résumé des solutions:

  1. Étendez le contrôleur à la portée de la session (utilisez @scope("session") au niveau du contrôleur) et ayez simplement une instance de panier dans le contrôleur.
  2. Étendre le contrôleur pour demander et faire injecter le panier de portée de session.
  3. Il suffit d'utiliser la session directement - un peu désordonné, OMI.
  4. Utilisez l'annotation de Spring <aop:scoped-proxy/>.

Toutes les méthodes ont leurs avantages et leurs inconvénients. J'utilise généralement l'option 2 ou 4. L'option 4 est en fait assez simple et c'est la seule approche que j'ai vue documentée par Spring.

13
stephen.hanson

Vous avez juste besoin d'ajouter l'annotation Scope comme ci-dessous avec le mode session et proxy

@Component
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class ShoppingCart implements Serializable{
}

Où que vous ayez besoin d'utiliser un objet de panier, vous pouvez le câbler automatiquement

@Service
public class ShoppingCartServiceImpl implements ShoppingCartService {
    Logger logger = LoggerFactory.getLogger(ShoppingCartServiceImpl.class);


    @Autowired
    ShoppingCart shoppingCart;
}

Divulgation: J'ai développé un exemple de projet, qui utilise Spring MVC, angularJS et bootstrap qui démontre la portée de Spring Session -
https://github.com/dpaani/springmvc-shoppingcart-sample

2