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.
@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);
}
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:
@scope("session")
au niveau du contrôleur) et ayez simplement une instance de panier dans le contrôleur.<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.
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