@ManagedBean y @Transactional - ¿Error en primavera? Soluciones?
-
28-10-2019 - |
Pregunta
Tuve el siguiente bean de respaldo de JSF en mi aplicación web
@ManagedBean
class MyBackingBean implements Serializable {
private MyHibernateRepository repository;
...
@Transactional
public void save() {
....
repository.save(myObject);
}
}
Cuando llega al repository.save
Llamada de método: recibo el siguiente error
no transaction is in progress
Tengo dos preguntas
- ¿Es esto por un error? como esto?
- Creo que hay dos soluciones: ¿hay otros?
2.1 Primera solución - usando
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
repository.save(myObject);
}
});
2.2 segundos solucionadores
Cree una clase de ayudante y anote eso en su lugar.
2.3 (Una posible tercera solución sería anotar @Transactional en un método de una clase interna, esto es bastante similar a 2.2).
Solución
Al usar anotaciones de primavera (sé que @Transactional
es un estándar de sol, pero necesita una implementación): Spring usa AOP para anotar a la clase para agregar el código de manejo de transacciones. Esto solo funciona para los frijoles de primavera. Si su clase es un frijol de respaldo para JSF: el marco Mojarra no inserta su propio código de manejo de transacciones en esta anotación.
Respuesta corta - @Transactional
Funciona para frijoles cargados por primavera. De lo contrario, debe encontrar un marco que lo respalde o asumiera que no funcionará.