Grails 将样板代码移出控制器

Grails 将样板代码移出控制器,grails,groovy,Grails,Groovy,我只是从grails开始,并生成了一些脚手架。 这里似乎有一些非常通用的代码,将在每个控制器中重复 def update(Long id, Long version) { def personInstance = Person.get(id) if (!personInstance) { flash.message = message(code: 'default.not.found.message', args: [message(code: 'person

我只是从grails开始,并生成了一些脚手架。 这里似乎有一些非常通用的代码,将在每个控制器中重复

  def update(Long id, Long version) {
    def personInstance = Person.get(id)
    if (!personInstance) {
        flash.message = message(code: 'default.not.found.message', args: [message(code: 'person.label', default: 'Person'), id])
        redirect(action: "list")
        return
    }

    if (version != null) {
        if (personInstance.version > version) {
            personInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
                      [message(code: 'person.label', default: 'Person')] as Object[],
                      "Another user has updated this Person while you were editing")
            render(view: "edit", model: [personInstance: personInstance])
            return
        }
    }
  • 测试get()是否成功
  • 乐观锁定检查
  • 您建议如何将其从控制器中删除? 理想情况下,我只想做一个

    def personInstance = Person.get(id)
    
    然后让一个异常处理程序为每个控制器执行默认情况下在每个控制器中生成的操作

      def update(Long id, Long version) {
        def personInstance = Person.get(id)
        if (!personInstance) {
            flash.message = message(code: 'default.not.found.message', args: [message(code: 'person.label', default: 'Person'), id])
            redirect(action: "list")
            return
        }
    
        if (version != null) {
            if (personInstance.version > version) {
                personInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
                          [message(code: 'person.label', default: 'Person')] as Object[],
                          "Another user has updated this Person while you were editing")
                render(view: "edit", model: [personInstance: personInstance])
                return
            }
        }
    

    如果要更改控制器的默认支架,只需发出“grails安装模板”命令。许多文件将在src/templates文件夹中创建。其中之一是“src/templates/scaffolding/Controller.groovy”

    然后只需将“update”函数修改为您需要的格式,并再次为您的域类生成控制器


    但是,如果你真的不想使用乐观/悲观锁定,你应该考虑一下,因为这使得你的应用不知何故不是事务性的。

    看看,它提出了一个Groovy模式。如果您提出了一个很好的解决方案,请告诉我们,我将自己做类似的事情。

    谢谢,我不知道grails安装模板。我想使用乐观锁定——我只是不想用基本相同的代码手动检查每个控制器。