【问题标题】:RuntimeError handling in Grails using View-Controller-Service architecture使用 View-Controller-Service 架构在 Grails 中处理 RuntimeError
【发布时间】:2011-01-16 04:23:06
【问题描述】:

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

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>

doSomething() 抛出 RuntimeException 时会出现问题。此 RuntimeException 回滚事务并结束 Hibernate 会话。当我在 RuntimeError 之后渲染 doAction.gsp 时,它以错误结束,因为无法读取延迟加载的字段 anotherDomain(无会话)。现在你可以说“好的,不要使用 RuntimeException”,但我需要自动事务回滚。

任何想法如何保持 Hibernate 会话打开,即使 RuntimeException 发生在事务服务中,以便 gsp 中的延迟加载可以正确呈现?谢谢。

【问题讨论】:

  • 您是否尝试过使您在 GSP 中尝试访问的字段不延迟加载?我知道这不是您问题的直接解决方案,但在您找到答案之前,这可能是一种短期解决方法。
  • 当然,这可行,但我需要更稳定的解决方案。永远不知道会抛出什么异常。

标签: exception grails exception-handling service grails-controller


【解决方案1】:

如果您的 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]
  }
}

希望这适合您的需求。 Reference

【讨论】:

  • 不幸的是,这也是我找到的唯一解决方案。
猜你喜欢
  • 1970-01-01
  • 2011-09-14
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多