我已升级为使用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文档声明绑定将在调用操作之前的命令对象的实例,但在我的情况下,它不是。
谷歌没有发现任何事情显然我是第一个必须处理这个问题的人之一。问题是如何解决这个问题?
答案 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中的这些数据绑定形式非常方便,但也不分青红皂白。换句话说,它们将绑定目标对象的所有非瞬态类型 [我的粗体] 实例属性,包括您可能不想要绑定的属性。