Grails - 创建只读api

时间:2011-11-22 13:17:32

标签: grails gorm readonly

我想将控制器中的一些操作限制为只读。 有什么办法可以吗? 对于某些操作,我想要的是在完成后不保存的事务。

感谢任何帮助。

我们谈论的是1.3.7。

4 个答案:

答案 0 :(得分:4)

“如何制作只读域名”不时出现在邮件列表和其他地方。

快速回答是:您无法100%抵御写入。

实现某些只读的各种方法:

  1. 使用.read()方法获取一个对象,确保您需要显式.save()以使项目保持不变。

  2. 如果在sql上,你可以创建一个视图并为这个视图创建一个域类映射,然后你就不能保存(并且尝试保存会抛出错误)。

  3. make beforeUpdate()抛出异常,从而停止保存。

  4. 对静态映射的更改= {},但我不太清楚在那里做什么,已经在邮件列表中提到了我能记得的全部内容,谷歌浏览grails-user的nabble列表如果你想知道。

  5. 如果你的东西是相当静态的,那么mysql视图是个不错的选择,如果你需要查询它们,则beforeUpdate()可能是个不错的选择。

    你要求'只读行动',你的意思是脚手架吗?以编程方式禁止在控制器操作中保存并不比仅添加保存(或根本不修改对象)更难。

答案 1 :(得分:2)

将逻辑放在grails服务方法

class MyController {
  def myService

  def myAction = {
    myService.method(params)
    []
  }
  ...
}

并将其标记为只读:

class MyService {
  @Transactional(readOnly = true)
  def method(def patams) { ... }
}

答案 2 :(得分:1)

您可以在域对象上使用withTransaction方法,并将其设置为仅在那里回滚。

http://grails.org/doc/latest/ref/Domain%20Classes/withTransaction.html

声明式事务管理是内置的服务,请参阅Grails参考手册Declarative Transactions。它不适用于控制器,但有一个插件:http://www.grails.org/plugin/transactional-controller

答案 3 :(得分:0)

不确定这对你来说是否足够,但是有一种只读的方法,而不是get http://grails.org/doc/latest/ref/Domain%20Classes/read.html