请求参数没有绑定到grails命令对象

时间:2012-11-20 16:33:56

标签: grails grails-controller grails-2.1

我已升级为使用Grails 1.3.6中的Grails 2.1.1,并且一些正在运行的命令对象不再从请求参数中获取数据绑定。

我创建了一个实验控制器来重现问题:

package my.controllers

import troubleshooting.*

class ExperimentalController {


    def toggle(ExperimentalCommand cmd){
        render "<pre>${this.properties}</pre>"
        render "<h3>Raw</h3>The cmd.id was/is '${cmd.id}'<br/>The params.id was/is '${params.id}'<br/>They should be the same but they aren't<br/>The target ala cmd then params was/is '${cmd.target}' '${params.target}'<br/><hr/><hr/>"
        bindData(cmd,params)//not even this works wtf?
        render "<h3>bindData(cmd,params)</h3>The cmd.id was/is '${cmd.id}'<br/>The params.id was/is '${params.id}'<br/>They should be the same but they aren't<br/>The target ala cmd then params was/is '${cmd.target}' '${params.target}'<br/><hr/><hr/>"
        cmd = new ExperimentalCommand()
        render "<h3>New Cmd</h3>The cmd.id was/is '${cmd.id}'<br/>The params.id was/is '${params.id}'<br/>They should be the same but they aren't<br/>The target ala cmd then params was/is '${cmd.target}' '${params.target}'<br/><hr/><hr/>"
        cmd = new ExperimentalCommand(params)
        render "<h3>New Cmd binding constructor</h3>The cmd.id was/is '${cmd.id}'<br/>The params.id was/is '${params.id}'<br/>They should be the same but they aren't<br/>The target ala cmd then params was/is '${cmd.target}' '${params.target}'<br/><hr/><hr/>"
        bindData(cmd,params,[include:["id","target"]])
        render "The cmd.id was/is '${cmd.id}'<br/>The params.id was/is '${params.id}'<br/>They should be the same but they aren't<br/>The target ala cmd then params was/is '${cmd.target}' '${params.target}'<br/><hr/><hr/>"

    }
}
class ExperimentalCommand{
    def id,target,action,controller

}

如果您执行:

grails run-app

然后转到:

http://localhost:8080/YourApp/experimental/toggle/foo?target=bullseye&cmd.target=whatever

你会看到(在我的情况下)第一次渲染cmd.id的尝试显示为null,尽管params.id是foo

从这个练习中我还发现没有指定include的id绑定调用的bindData调用失败并且使用params显式地实例化命令对象会导致异常。

我在这里完全失败了。我已经尝试过覆盖getInstanceControllersApi方法来返回记录不同bindData调用的包装器,这样我就可以看到会发生什么以及如何控制它只是告诉我什么。

我可以向命令对象添加控制器和操作字段,以防止它在我调用新的ExperimentalCommand(params)时出错,但是我不应该做任何Grails文档声明绑定将在调用操作之前的命令对象的实例,但在我的情况下,它不是。

谷歌没有发现任何事情显然我是第一个必须处理这个问题的人之一。

问题是如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

对1.3.6和2.x之间的数据绑定机制进行了各种更改,我要尝试的第一件事是给命令对象属性正确的类型,而不仅仅是def

class ExperimentalCommand{
    String id
    String target
    String action
    String controller
}

The Grails 2.1.1 docs数据绑定谈论new CommandObject(params)obj.properties = params形式的数据绑定并说明

  

Grails中的这些数据绑定形式非常方便,但也不分青红皂白。换句话说,它们将绑定目标对象的所有非瞬态类型 [我的粗体] 实例属性,包括您可能不想要绑定的属性。