grails-orm - 使用 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
在控制器中使用时id
,MyDomain
可以通过请求参数更改。这可以通过这个失败的测试来检查:
// 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
解决方案
使用 gorm 继承时,src
必须将其中的基类声明为抽象类,如下所示:
// src/main/groovy/demo/MyBaseClass.groovy
package demo
import grails.gorm.dirty.checking.DirtyCheck
@DirtyCheck
abstract class MyBaseClass {
String name
}
推荐阅读
- applescript - 升级到 Catalina 后无法在 AppleScript 中获取智能相册
- c++ - 花括号内的结构声明
- angular - JUnit 测试用例出错。“没有找到测试运行器'JUnit'的测试
- r - 从其他多列的值有条件地替换多列的值
- google-apps-script - “需要授权”和@OnlyCurrentDoc
- python - Pandas Dataframe 错误'StringArray 需要一系列字符串或 pandas.NA'
- python - Tkinter 绘制 jpeg 或 png
- python - 如何将两个熊猫数据框放在一起,一个数据框缺少日期
- javascript - 我的两个 jQuery 代码相互冲突
- tcl - 有没有办法在 TCL 中使用 IF CONDITION 期望语句?