java - transaccional - transacciones con spring framework
Los métodos @Transactional en la clase @Controller no se consideran transaccionales (2)
No hagas transacciones en tu controlador. Póngalos en sus clases de capa de servicio.
Separe su código en model-view-controller.
Sí, es una conspiración. Le permite compartir código entre controladores / vistas sin repetir el código. Y también detiene las reversiones de transacciones innecesariamente (para excepciones no relacionadas con la transacción real).
Puede parecer más código para empezar, pero a la larga es mucho más manejable y más simple de desarrollar.
Noté que lo siguiente no funciona en una clase marcada como @Controller
:
@Autowired
SessionFactory sessionFactory;
@ResponseBody
@Transactional
@RequestMapping(method = RequestMethod.GET , value = "/map")
public ArrayList<PhotoDTO> getPhotos(...someParams) {
Entity result sessionFactory.getCurrentSession()... //do some manipulation
return result;
}
cuando llamo a la URL, aparece un error que dice que el método no es transaccional (aunque, como puede ver, está marcado como uno)
Si copio este método en otra clase llamada MyService y lo llamo desde el controlador, funciona perfectamente
¿Es esto una especie de consejo de primavera (una conspiración para hacerme usar más clases más o menos)?
Probablemente tiene dos contextos de aplicación aquí: contexto principal de Spring cargado por ContextLoaderListener
y un contexto secundario cargado por DispatcherServlet
. Debe colocar <tx:annotation-driven />
en la configuración cargada también por el contexto secundario. Si nos muestra su archivo web.xml
, quizás pueda ayudarlo más.
De todos modos, como dice @NimChimpsky, generalmente no es una buena práctica administrar las transacciones en la capa de su controlador.