Grails/Angular $http() не привязывает объекты команд
В настоящее время мы работаем над обновлением нашего проекта с Grails 2.2 до Grails 3.0 и столкнулись с многочисленными проблемами. Тот, над которым я сейчас работаю, связан с Angular $http() и объектами Command, а не с привязкой данных.
В настоящее время мы позволяем Grails связывать все наши объекты Command в наших методах Controller. Это делается ВЕЗДЕ, и было бы много работы, чтобы связать все вручную (единственное решение, которое я могу найти прямо сейчас). Мы знаем, что в конечном итоге мы должны сделать это (больше контроля. Граальс постоянно неправильно связывается), но лучше не делать этого, если не принуждают.
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
}
}
Наше предыдущее решение включало перехватчик, который брал бы поля request.JSON и выводил их в параметры, если в параметрах уже не было значения.
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 это работает не так, как раньше. В то время как значения, похоже, правильно отображаются в "params", в объекте Command все установлено в нуль. Я могу только предположить, что объект Command сейчас "создается" до запуска перехватчика. Объекты Command правильно связаны с нашими вызовами $.ajax(), так как значения задаются в params, а не в request.JSON.
Есть ли способ каким-то образом получить созданный объект Command Object в перехватчике, чтобы установить его вручную, или у кого-нибудь есть другие идеи для решения?
РЕДАКТИРОВАТЬ: Пример $ http () угловой вызов
var data = { objectId: 1 };
$http({
method: 'POST',
url: myUrl,
data: data
}).success(function() {
//stuff
});