Je voudrais implémenter un panier d'achat avec Spring, donc j'ai besoin de sauvegarder un objet Cart
(qui a des attributs comme les produits, le type de paiement et le type de livraison) dans la session. J'ai essayé de le créer avec le bean et l'attribut "scope" défini sur "session", mais cela ne fonctionne pas. Dois-je utiliser des annotations supplémentaires dans mon contrôleur ou bien Cart
classe ? Tout exemple d'utilisation serait vraiment utile :-) Merci d'avance.
Réponses
Trop de publicités?@Component
@Scope("session")
public class Cart { .. }
et ensuite
@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 d'achat directement dans votre contrôleur, le problème vient probablement du fait que votre contrôleur a une portée singleton (par défaut), c'est-à-dire une portée plus large que le haricot que vous injectez. Cet excellent article donne un aperçu de quatre approches permettant de réaliser exactement ce que vous essayez de faire : http://richardchesterwood.blogspot.co.uk/2011/03/using-sessions-in-spring-mvc-including.html .
Voici un résumé rapide des solutions :
- Étendre le contrôleur à l'étendue de la session (utiliser
@scope("session")
au niveau du contrôleur) et avoir simplement une instance de panier dans le contrôleur. - Étendre le contrôleur à la demande et injecter le panier d'achat en fonction de la session.
- Il suffit d'utiliser la session directement - un peu désordonné, IMO.
- Utiliser l'annotation de Spring
<aop:scoped-proxy/>
.
Toutes les méthodes ont leurs avantages et leurs inconvénients. Je choisis 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 vu documenté par Spring.
Il suffit d'ajouter l'annotation Scope comme ci-dessous avec la session et le mode proxy.
@Component
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class ShoppingCart implements Serializable{
}
Partout où vous avez besoin d'utiliser l'objet panier, vous pouvez le connecter automatiquement.
@Service
public class ShoppingCartServiceImpl implements ShoppingCartService {
Logger logger = LoggerFactory.getLogger(ShoppingCartServiceImpl.class);
@Autowired
ShoppingCart shoppingCart;
}
Divulgation : J'ai développé un projet d'exemple, qui utilise spring MVC, angularJS et bootstrap qui démontre la portée de Spring Session -.
https://github.com/dpaani/springmvc-shoppingcart-sample