首页 > 解决方案 > 使用 gorm 继承时,bindData() 正在更改域 id

问题描述

我有一个 grails 域类,它扩展了src文件夹中的基类,如下所示:

// src/main/groovy/demo/MyBaseClass.groovy
package demo

import grails.gorm.dirty.checking.DirtyCheck

@DirtyCheck
class MyBaseClass {
    String name
}
// grails-app/domain/demo/MyDomain.groovy
package demo

class MyDomain extends MyBaseClass {
    Date birthDate
}

但是,bindData在控制器中使用时idMyDomain可以通过请求参数更改。这可以通过这个失败的测试来检查:

// src/test/groovy/demo/IdDataBindingSpec.groovy
package demo

import grails.web.databinding.DataBinder
import org.grails.testing.GrailsUnitTest
import spock.lang.Specification

class IdDataBindingSpec extends Specification 
        implements GrailsUnitTest, DataBinder {

    void "Bind id to MyDomain is not possible"() {
        given: "A new instance"
            MyDomain myDomain = new MyDomain()
        and: "Request params"
            Map params = [id:5, name:'test']

        when: "Binding data"
            bindData(myDomain, params)

        then: "id is not updated"
            !myDomain.id
        and: "Other params are updated"
            myDomain.name == 'test'
    }
}

任何普通域都会通过上述测试,但扩展基类的域src不会。我该如何解决这种行为?

编辑:我使用 Grails 3.3.8 和 gorm 6.1

标签: grails-ormgrails-3.0grails-3.3

解决方案


使用 gorm 继承时,src必须将其中的基类声明为抽象类,如下所示:

// src/main/groovy/demo/MyBaseClass.groovy
package demo

import grails.gorm.dirty.checking.DirtyCheck

@DirtyCheck
abstract class MyBaseClass {
    String name
}

推荐阅读