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

请求参数未绑定到grails命令对象,grails,grails-controller,grails-2.1,Grails,Grails Controller,Grails 2.1,我已经从Grails1.3.6升级到使用Grails2.1.1,一些正在工作的命令对象不再从请求参数获取数据绑定 我创建了一个实验控制器来重现问题: package my.controllers import troubleshooting.* class ExperimentalController { def toggle(ExperimentalCommand cmd){ render "<pre>${this.properties}</p

我已经从Grails1.3.6升级到使用Grails2.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

}
您将看到(在我的情况下),尽管params.id是foo,但第一次尝试呈现cmd.id时它显示为null

http://localhost:8080/YourApp/experimental/toggle/foo?target=bullseye&cmd.target=whatever
在这个练习中,我还发现没有专门指定include id和target的bindData调用失败,并且使用params显式实例化命令对象会导致异常

我在这里完全不知所措。我尝试过重写getInstanceControllersApi方法,以返回一个记录不同bindData调用的包装器,这样我就可以看到发生了什么,以及如何控制它,但这并没有告诉我什么

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

谷歌还没有发现任何东西,所以很显然我是第一批处理此事的人之一


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

1.3.6和2.x之间的数据绑定机制发生了各种变化,我要尝试的第一件事是为命令对象属性提供正确的类型,而不仅仅是
def

对于数据绑定,讨论数据绑定的
新CommandObject(params)
obj.properties=params
形式,并说明

Grails中的这些数据绑定形式非常方便,但也不分青红皂白。换句话说,它们将绑定目标对象的所有非瞬态、键入的[my bold]实例属性,包括您可能不希望绑定的属性


我也试过这些东西。每个文档都需要严格类型化,这样它才能进行转换,但即使这样,命令object中仍然会出现空值。我只是调整了日志记录设置,以在调试级别记录grails内部和spring类,我发现:
code
debug validation.DataBinder-Field[target]已从PropertyValue中删除,将不会绑定,因为在允许字段列表2012-11-20 12:43:32469[http-bio-443-exec-3]调试验证中未找到该字段。DataBinder-字段[id]已从PropertyValue中删除,不会绑定,因为在允许字段列表2012-11-20 12:43:32469[http-bio-443-exec-3]
code
中找不到它,您是否已更改为字符串?出于安全考虑,该id不会被绑定,您必须手动绑定,但我认为所有其他id都是允许的。我只是通过添加:bindable:true to The constraints(可绑定):尽管如此,我仍然认为存在一些问题-这使得代码不那么枯燥和groovy;我现在正在Config.groovy或BuildConfig.groovy中搜索一个可能指示它使用此行为的设置
class ExperimentalCommand{
    String id
    String target
    String action
    String controller
}