我正在将Grails v1.1.1应用程序升级到Grails v2.2.1。
升级本身运行良好。在升级所有插件并清理数据库问题之后,应用程序正常启动并且运行正常,除了一个主要问题:表单处理中使用的命令对象的数据绑定不起作用。
应用程序在许多Controller操作中使用命令对象,例如:
def quick_add_thing = { ThingCommand cmd ->
....
提交表单时,将调用该操作,但Command对象值均为null。 参数图包含正确的值。
如果我将动作声明更改为更新的形式:
def quickAddThing(ThingCommand cmd) {
....
它仍然失败。
如果我在命令对象上使用bindData
控制器方法,则可以:
def quickAddThing()
{
ThingCommand cmd = new ThingCommand();
bindData(cmd, params);
在这种情况下,命令对象具有正确设置的所有值...甚至与其他类的关联。
我不确定还有什么可以尝试或在哪里寻找答案。有什么建议吗?
更新1
我认为这与命令对象或参数有关,除了bindData(cmd,params)
调用有效,而且我可以找到,应该是相同的操作
该方法是POST 这是命令对象声明之一:
class ContentmgrCommand {
ContentManager contentmgr
String firstName
String lastName
String email
String username
String password
String passwordHash
ReminderQuestion reminderQuestion
String reminderAnswer
def passwordService
static constraints = {
firstName(blank: false)
lastName(blank: false)
email(email: true)
username(blank: false, validator: { val, obj ->
def user = JsecUser.findByUsername(val)
if (user?.username == obj?.contentmgr?.username) {
// That's okay
} else if (user) {
return ['username.exists']
} else {
obj?.username = val
}
})
reminderAnswer(blank: false)
passwordHash(nullable: true)
password(validator: { val, obj ->
if (obj?.contentmgr) { // Editing existing user
if (val && val !=~/\s+/ && val != "****") {
def error = obj.passwordService.validateNewRules(val, val)
if (error) {
return ['admin.quick.edit.password_invalid']
}
obj?.contentmgr?.passwordHash = DigestUtils.shaHex(val)
}
} else if (!val) { // Password field wasn't present on the form
obj?.password = PasswordGenerator.generate()
obj?.passwordHash = DigestUtils.shaHex(obj?.password)
}
return true
})
}
以下是请求失败的参数:
params:
[reminderAnswer:Larry,
lastName:Approve,
username:testapprovo,
reminderQuestion.id:4,
reminderQuestion:[id:4],
contentmgr.id:2010,
contentmgr:[id:2010],
email:someperson@gmail.com,
ajax:true,
firstName:Test,
password:project1,
action:quick_edit_contentmgr,
controller:admin]
更新2
我可以使它工作(有点)。
我必须:
肯定是有些事情......只是不确定是什么。
更新3
我创建了一个具有不同名称的新命令对象,将其传递给正确的操作,并开始添加字段和约束以尝试隔离可能出错的内容。
即使添加了所有内容,它也能正常运行并且不会失败。
然后我进行了进一步的测试并拿走了旧的命令对象,放了一个' 2'在名称中(例如,ContentmgrCommand - > Contentmgr2Command)它开始工作。
我已经运行' grails clean',删除了缓存等,我无法隔离可能导致此问题的原因。我已经检查过在其他任何地方是否有对命令对象的引用,我根本找不到任何东西。我对所有命令对象进行了上述更改,现在它们正常工作。
非常令人费解......