grails 2.3.x:自动生成控制器的奇怪行为

时间:2014-09-25 14:34:11

标签: grails grails-2.3

新鲜的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'
输入存储在数据库中。

任何人都可以解释这种行为吗?感谢。

2 个答案:

答案 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版本中看到的输出(尽管再次,没有validatesave调用我无法想象为什么它会在2.2中工作任一)。