RuntimeError-Handhabung in Grails mit View-Controller-Service-Architektur
-
20-09-2019 - |
Frage
Ich habe die folgende Situation (natürlich vereinfacht):
MyDomain.groovy:
class MyDomain {
MyAnotherDomain anotherDomain // lazy loaded
}
MyService.groovy:
class MyService {
boolean transactional = true
def doSomething(id) {
// ... some code...
}
}
MYController.groovy:
class MyController {
def myService
def doAction = {
MyDomain aaa = ...GET_IT_FROM_SOMEWHERE...
try {
myService.doSomething(id)
} catch (RuntimeError e) {
flash.message = 'sorry.guy.your.transaction.was.rollbacked'
}
[myData: aaa]
}
}
doAction.gsp:
<html>
<body>
${myData.anotherDomain}
</body>
</html>
Das Problem tritt auf, wenn Dosenthing () RunTimeException wirft. Diese RunTimeException -Rollback -Transaktion und beendet auch die Hibernate -Sitzung. Wenn ich doaction.gsp nach dem RunTimeErrror rendere, endet es mit einem Fehler, da das faule geladene Feld eine andere Domäne nicht gelesen werden kann (keine Sitzung). Jetzt können Sie sagen "OK, verwenden Sie keine RunTimeException", aber ich brauche den automatischen Transaktionsrollback.
Irgendwelche Ideen, wie man die Hibernate -Sitzung offen hält, auch wenn RunTimeException im Transaktionsdienst stattfindet, damit das faule Laden in GSP ordnungsgemäß rendern kann? Vielen Dank.
Lösung
Wenn Ihre Hibernate -Sitzung während des Rollback- und Xception -Werfens zerstört wird, können Sie versuchen, es manuell wieder an die aktuelle Hibernate -Sitzung wieder zu bringen:
MyController.Groovy:
class MyController {
def myService
def doAction = {
MyDomain aaa = ...GET_IT_FROM_SOMEWHERE...
try {
myService.doSomething(id)
} catch (RuntimeError e) {
flash.message = 'sorry.guy.your.transaction.was.rollbacked'
if(!aaa.isAttached()) {
aaa.attach()
}
}
[myData: aaa]
}
}
Hoffe das ist für deine Bedürfnisse geeignet.Bezug