Exception 使用视图控制器服务架构在Grails中处理运行时错误

Exception 使用视图控制器服务架构在Grails中处理运行时错误,exception,grails,exception-handling,service,grails-controller,Exception,Grails,Exception Handling,Service,Grails Controller,我有以下情况(当然是简化): MyDomain.groovy: 类MyDomain{ MyAnotherDomain anotherDomain//延迟加载 } MyService.groovy: 类MyService{ 布尔事务=真 def剂量计(id){ //…一些代码。。。 } } MYController.groovy: 类MyController{ def myService def doAction={ MyDomain aaa=…从某处获取它。。。 试一试{ myService.d

我有以下情况(当然是简化):

MyDomain.groovy:
类MyDomain{
MyAnotherDomain anotherDomain//延迟加载
}
MyService.groovy:
类MyService{
布尔事务=真
def剂量计(id){
//…一些代码。。。
}
}
MYController.groovy:
类MyController{
def myService
def doAction={
MyDomain aaa=…从某处获取它。。。
试一试{
myService.doSomething(id)
}捕获(运行时错误e){
flash.message='抱歉,guy.your.transaction.was.rollbacked'
}
[我的数据:aaa]
}
}
doAction.gsp:
${myData.anotherDomain}
当doSomething()抛出RuntimeException时会出现问题。此RuntimeException回滚事务并结束Hibernate会话。在RuntimeError之后呈现doAction.gsp时,它以错误结束,因为无法读取另一个域的延迟加载字段(无会话)。现在您可以说“好的,不要使用RuntimeException”,但我需要自动事务回滚


即使事务性服务中发生运行时异常,如何保持Hibernate会话打开,以便gsp中的延迟加载可以正确呈现?谢谢。

如果您的Hibernate会话在回滚和异常抛出过程中被破坏,您可以尝试手动将其重新连接到当前Hibernate会话:

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]
  }
}
希望这适合你的需要。

您是否尝试过使您试图在GSP中访问的字段不延迟加载?我知道这不是你问题的直接解决方案,但在你找到答案之前,这可能是一个短期的解决办法。当然,这是可行的,但我需要更稳定的解决方案。永远不知道会抛出什么异常。不幸的是,这也是我找到的唯一解决方案。
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]
  }
}