新鲜的grails 2.3.x项目。我使用自动生成的控制器和域类的视图。我想直接在控制器中设置一个(非空)属性,所以我从_form.gsp中删除了输入字段。
域类:
class Demo {
String demo
String status
static constraints = {
demo nullable: false
status nullable: false
}
在表单中我只填写演示字段。
自动生成的控制器导致:
...
@Transactional
def save(Demo demoInstance) {
if (demoInstance == null) {
notFound()
return
}
// set the status property to "test"
demoInstance.status = "test"
println "1 STATUS: ${demoInstance.status}"
if (demoInstance.hasErrors()) {
println "2 STATUS: ${demoInstance.status}"
respond demoInstance.errors, view: 'create'
return
}
println "3 STATUS: ${demoInstance.status}"
...
填写表格并将状态属性留空结果为
println 1 - > status ='test'
println 2 - > status ='test'
重定向以创建带有消息的页面:“类[演示]的属性[状态]不能为空”
当我在Grails 2.2.x中更改控制器时:
...
@Transactional
def save() {
def demoInstance = new Demo(params)
if (demoInstance == null) {
notFound()
return
}
// set the status property to "test"
demoInstance.status = "test"
println "1 STATUS: ${demoInstance.status}"
if (demoInstance.hasErrors()) {
println "2 STATUS: ${demoInstance.status}"
respond demoInstance.errors, view: 'create'
return
}
println "3 STATUS: ${demoInstance.status}"
...
这导致预期的输出:
println 1 - > status ='test'
println 3 - > status ='test'
输入存储在数据库中。
任何人都可以解释这种行为吗?感谢。
答案 0 :(得分:1)
我有同样的问题。不知道确切的原因,但有效的是:
bindData(demoInstance,[status:' test'])
Grails 2.3有一个新的DataBinding。如果设置
,你可以使用旧的Spring样式
grails.databinding.useSpringBinder = true
在Config.groovy中
使用此SpringBinder,不会发生此问题。
答案 1 :(得分:1)
我不知道为什么你会看到你在2.2.x代码中看到的行为,但无论你使用哪种数据绑定器,2.3.x行为对我来说都是正确的。数据绑定在调用控制器操作之前发生,并且由于您未设置属性,因此实例具有验证错误。然后,您设置了有效值但不要调用validate()
或save()
,因此没有理由期望hasErrors()
会从false更改为true。
如果你添加
demoInstance.validate()
之后
demoInstance.status = "test"
然后我希望看到您在2.2.x版本中看到的输出(尽管再次,没有validate
或save
调用我无法想象为什么它会在2.2中工作任一)。