我们目前正在努力将我们的项目从 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
});