1

我们目前正在努力将我们的项目从 Grails 2.2 升级到 Grails 3.0,并且遇到了许多问题。我目前正在处理的问题与 Angular $http() 和命令对象没有正确数据绑定有关。

我们目前让 Grails 在 Controller 方法中绑定所有的 Command 对象。这是在任何地方完成的,手动绑定所有内容将是很多工作(我现在唯一能想到的解决方案)。我们知道我们最终需要这样做(更多控制。Grails 经常错误地绑定),但除非被迫这样做,否则我们宁愿不这样做。

class MyController {
    def updateStatus(StatusCommand cmd) {
        println("params: ${params}")
        println("cmd: ${cmd}")

        // example with objectId = 1 being passed in as http() data
        // params will be: objectId: 1
        // cmd will be: cmd.objectId: null
    }
}

我们之前的解决方案涉及一个拦截器,如果 params 中没有值,它将获取 request.JSON 字段并将它们转储到 params 中。

def beforeInterceptor = {
    if (request.JSON) {
        request.JSON?.each { key, value ->
            if (!params[key]) {
                params[key] = value 
            }
        }
    }
}

在 Grails 3.0 中,拦截器现在是在控制器之外单独定义的,所以我创建了以下内容来复制我们之前的内容。

class MyInterceptor {
    MyInterceptor {
        matchAll()
    }

    boolean before() {
        if (request.JSON) {
            request.JSON?.each { key, value ->
                if (!params[key]) {
                    params[key] = value 
                }
            }
        }
    }
}

不幸的是,这似乎不像以前那样在 Grails 3.0 中工作。虽然这些值似乎在“参数”上正确映射,但命令对象将所有内容都设置为空。我只能假设在拦截器运行之前“创建”命令对象。命令对象从我们的 $.ajax() 调用中正确绑定,因为这些值被设置为 params 而不是 request.JSON。

有没有办法以某种方式让拦截器中创建的命令对象手动设置它,或者是否有人对解决方案有任何其他想法?

编辑:$http() 角度调用示例

var data = { objectId: 1 };
$http({
    method: 'POST',
    url: myUrl,
    data: data
}).success(function() {
    //stuff
});
4

0 回答 0