Grails 2.2.1升级问题:数据绑定到命令对象不起作用

时间:2014-06-10 21:42:25

标签: grails

我正在将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

我可以使它工作(有点)。

我必须:

  • 将命令对象放在单独的源文件中
  • 将其标记为@Validatable
  • 创建构造函数
  • 导入grails.utils.Holders以便通过Holders.grailsApplication设置命令对象使用的服务,并在命令对象构造函数中设置服务
  • 在控制器操作中实例化命令对象
  • 在控制器操作
  • 中的命令对象上调用bindData
  • 在控制器操作
  • 中对命令对象调用validate()

肯定是有些事情......只是不确定是什么。

更新3

我创建了一个具有不同名称的新命令对象,将其传递给正确的操作,并开始添加字段和约束以尝试隔离可能出错的内容。

即使添加了所有内容,它也能正常运行并且不会失败。

然后我进行了进一步的测试并拿走了旧的命令对象,放了一个' 2'在名称中(例如,ContentmgrCommand - > Contentmgr2Command)它开始工作。

我已经运行' grails clean',删除了缓存等,我无法隔离可能导致此问题的原因。我已经检查过在其他任何地方是否有对命令对象的引用,我根本找不到任何东西。我对所有命令对象进行了上述更改,现在它们正常工作。

非常令人费解......

0 个答案:

没有答案