create - ¿Cómo saber si un método transaccional en un servicio de Grails fue exitoso?
gorm outside grails (2)
Hay varias formas de verificar lo mismo:
Como no desea rastrear todos los
saves
en la clase de servicio, supongo que tampoco le gustaría rastrear cada uno de losfailOnError
para establecer el indicadorfailOnError
. El enfoque alternativo es establecergrails.gorm.failOnError=true
enConfig.groovy
que verifica automáticamente cada guardado y arroja unaValidationException
en caso de que falle la validación en la clase de dominio.ValidationException
es unaRuntimeException
por lo tanto, la transacción se revertirá si se lanza. Echa un vistazo a failOnError para entender la idea.(Poco menos detallado en su caso) El método Save devuelve el objeto de dominio en sí mismo en caso de éxito, de lo contrario nulo si falla la validación. Nuevamente ha rastreado todos los
if(a.save()){...}
para verificar algo comoif(a.save()){...}
,if(b.save()){...}
, blah, blah ...(Creo que el enfoque apropiado) será usar
TransactionAspectSupport
para obtener el estado de la transacción y verificar si está configurado para deshacer solo. Si no es así, eres bueno.
Por ejemplo:
def someMethod(){
try{
...
a.save()
....
b.save()
....
c.save()
....
etc...
}catch(e){
//It can also be used as a last line in method instead of checking
//in catch block.
println TransactionAspectSupport.currentTransactionStatus().isRollbackOnly()
}
//println TransactionAspectSupport.currentTransactionStatus().isRollbackOnly()
}
Tengo algo como esto:
class SomeService {
static transactional = true
def someMethod(){
...
a.save()
....
b.save()
....
c.save()
....
etc...
}
}
Quiero saber si el método transaccional fue exitoso o no, no quiero verificar la propiedad de error en cada objeto de dominio porque la lógica involucra muchas clases de dominio y sería difícil.
Utilizar
a.save(failOnError: true)
b.save(failOnError: true)
c.save(failOnError: true)
d.save(failOnError: true)
Supongo que lo que quiere es que el servicio arroje una excepción por error de un solo guardado de dominio y deshaga la transacción en tales casos.