Me gustaría implementar un carrito de compras con Spring, así que tengo que guardar un objeto Cart
(que tiene atributos como products, paymentType y deliveryType) en sesión. He intentado crearlo con bean y atribuir "scope" a "sesión", pero simplemente no funciona, ¿debo usar algunas anotaciones adicionales en mi controlador o clase Cart
? Cualquier uso de ejemplo sería realmente útil :-) Gracias de antemano.Spring store objeto en la sesión
Respuesta
@Component
@Scope("session")
public class Cart { .. }
y luego
@Inject
private Cart cart;
debería funcionar, si se declara en el contexto web (despachador-servlet.xml). Una opción alternativa es utilizar la sesión prima y puesto que el objeto de la compra No:
@RequestMapping(..)
public String someControllerMethod(HttpSession session) {
session.addAttribute(Constants.CART, new Cart();
...
Cart cart = (Cart) session.getAttribute(Constants.CART);
}
Si se inyecta el carrito de la compra directamente en el controlador, el problema está probablemente sucede porque el controlador es Singleton con ámbito (por defecto) , que es un alcance más amplio que el bean que está inyectando. Este excelente artículo ofrece una descripción general de cuatro enfoques para exactamente lo que está tratando de hacer: http://richardchesterwood.blogspot.co.uk/2011/03/using-sessions-in-spring-mvc-including.html.
He aquí un breve resumen de las soluciones:
- Ámbito del controlador de ámbito de sesión (
@scope("session")
uso en el nivel de controlador) y sólo tiene una instancia de carrito de la compra en el controlador. - Alcance el controlador para solicitarlo e inyectar el carrito de compras del ámbito de la sesión.
- Simplemente use la sesión directamente - algo desordenado, IMO.
- Utilice la anotación de Spring
<aop:scoped-proxy/>
.
Todos los métodos tienen sus pros y sus contras. Yo suelo ir con la opción 2 o 4. La opción 4 es en realidad bastante simple y es el único enfoque que he visto documented by Spring.
La URL correcta es http: // richardchesterwood. blogspot.co.uk/2011/03/using-sessions-in-spring-mvc-including.html – Gilead
Gracias @Gilead. Actualicé con la URL correcta. –
Nota, con la solución n. ° 4, no use el método final en ningún método. Haga eso y ese acceso será singleton, no sesión con alcance ya que AOP no puede interceptar finales. –
Sólo tiene que añadir una anotación Alcance de la siguiente manera con el modo de sesión y el proxy
@Component
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class ShoppingCart implements Serializable{
}
Dónde cada vez que necesita para el carro de compras objeto, puede Autowire que
@Service
public class ShoppingCartServiceImpl implements ShoppingCartService {
Logger logger = LoggerFactory.getLogger(ShoppingCartServiceImpl.class);
@Autowired
ShoppingCart shoppingCart;
}
Revelación: he desarrollado un proyecto de ejemplo, que utiliza Spring MVC, AngularJS y de arranque que demuestran el alcance sesión de primavera -
https://github.com/dpaani/springmvc-shoppingcart-sample
- 1. Cómo almacenar la sesión en Spring MVC
- 2. Android Store un objeto parcelable en SQLite
- 3. Desvincular objeto de la sesión
- 4. Inicio de sesión único en Spring Application
- 5. Fábricas de sesión múltiple en Spring/Hibernate
- 6. php objeto ahorro en sesión
- 7. sesión de objeto en playframework
- 8. Spring Security, Spring MVC y Sesiones de inicio de sesión
- 9. ¿Cómo administrar un objeto de usuario personalizado en sesión cuando Spring Security autentica al usuario?
- 10. Eliminar objeto de la sesión SQLAlchemy
- 11. Desconectar objeto de la sesión de NHibernate
- 12. Recuperar ID de sesión con Spring Security
- 13. ¿Cómo manejar la sesión expirada utilizando spring-security y jQuery?
- 14. Establecer el modo de descarga de la sesión de Hibernate en Spring
- 15. Almacenamiento de objetos en la sesión
- 16. Spring 3.0 establece y obtiene el atributo de sesión
- 17. ASP.NET MVC Store TempData en Cookie
- 18. InApp Compra rechazada en la App Store
- 19. objeto de sesión en la prueba de integración rspec
- 20. Cómo iniciar sesión Http Request body en Spring MVC?
- 21. Cómo redirigir el mensaje de control de la sesión simultánea de seguridad Spring en la pantalla de inicio de sesión?
- 22. extjs store error handling
- 23. Spring 3.0 MVC objeto anidado vinculante
- 24. Cómo acceder al objeto Spring @Service desde la prueba jUnit
- 25. ¿Cómo guardo un objeto transitorio que ya existe en una sesión de NHibernate?
- 26. ¿Hay un "modo Spring 3 MVC" para escuchar el evento de la sesión final?
- 27. Cómo inyectar dependencias en un objeto autoejeado en Spring?
- 28. Spring Security: poner atributos adicionales (propiedades) en la sesión en el éxito Autenticación
- 29. Mantener registro del tiempo de inicio de sesión y la duración de la sesión - Java - Spring Security
- 30. cambiar el nombre de la aplicación en la App Store
Sí, funciona una opción alternativa, pero no quiero usarla. Cuando creo un carro de atributos privado en mi controlador, recibo el error "No se encontró ningún bean coincidente para la dependencia: se esperaba al menos 1 bean que califica como candidato de autowire para esta dependencia. Anotaciones de dependencia: {@ org.springframework.beans.factory.annotation.Autowired (required = true)} ". El bean debe definirse en applicationContext.xml como ? –
tomaszf
no. En dispatcher-servlet.xml. O, como mostré, declarado con las anotaciones – Bozho
Hmm, pero cuando uso anotaciones, sin la definición de bean en dispatcher-servlet.xml, obtengo el error que pegué antes, más cuando uso anotaciones y defino bean solo obtengo 404 solo con ese controlador. – tomaszf