Запросить параметры, не привязанные к объекту команды grails
Я перешел на Grails 2.1.1 из Grails 1.3.6, и некоторые работающие объекты команд больше не получают привязку данных из параметров запроса.
Я создал экспериментальный контроллер для воспроизведения проблемы:
package my.controllers
import troubleshooting.*
class ExperimentalController {
def toggle(ExperimentalCommand cmd){
render "<pre>${this.properties}</pre>"
render "<h3>Raw</h3>The cmd.id was/is '${cmd.id}'<br/>The params.id was/is '${params.id}'<br/>They should be the same but they aren't<br/>The target ala cmd then params was/is '${cmd.target}' '${params.target}'<br/><hr/><hr/>"
bindData(cmd,params)//not even this works wtf?
render "<h3>bindData(cmd,params)</h3>The cmd.id was/is '${cmd.id}'<br/>The params.id was/is '${params.id}'<br/>They should be the same but they aren't<br/>The target ala cmd then params was/is '${cmd.target}' '${params.target}'<br/><hr/><hr/>"
cmd = new ExperimentalCommand()
render "<h3>New Cmd</h3>The cmd.id was/is '${cmd.id}'<br/>The params.id was/is '${params.id}'<br/>They should be the same but they aren't<br/>The target ala cmd then params was/is '${cmd.target}' '${params.target}'<br/><hr/><hr/>"
cmd = new ExperimentalCommand(params)
render "<h3>New Cmd binding constructor</h3>The cmd.id was/is '${cmd.id}'<br/>The params.id was/is '${params.id}'<br/>They should be the same but they aren't<br/>The target ala cmd then params was/is '${cmd.target}' '${params.target}'<br/><hr/><hr/>"
bindData(cmd,params,[include:["id","target"]])
render "The cmd.id was/is '${cmd.id}'<br/>The params.id was/is '${params.id}'<br/>They should be the same but they aren't<br/>The target ala cmd then params was/is '${cmd.target}' '${params.target}'<br/><hr/><hr/>"
}
}
class ExperimentalCommand{
def id,target,action,controller
}
Если вы выполните:
Grails Run-приложение
С этим и затем перейдите к:
http://localhost:8080/YourApp/experimental/toggle/foo?target=bullseye&cmd.target=whatever
Вы увидите (при моих обстоятельствах), что первая попытка визуализации cmd.id показывает его как ноль, несмотря на тот факт, что params.id это foo
Из этого упражнения я также обнаружил, что вызовы bindData, которые не указывают, включают в себя идентификатор и цель исключительно сбой И создание экземпляра объекта команды явно с параметрами вызывает исключение.
Я в полной растерянности здесь. Я пробовал такие вещи, как переопределение метода getInstanceControllersApi, чтобы вернуть упаковщик, который регистрирует различные вызовы bindData, чтобы я мог видеть, что происходит, и как я мог бы контролировать это только то, что мне ничего не говорило.
Я могу добавить поля контроллера и действия к объекту команды, чтобы предотвратить его ошибку при вызове нового ExperimentalCommand(params), но мне не нужно было делать ничего из того, что в документации Grails указано, что привязка будет выполнена в случае объект команды перед действием вызывается, однако в моем случае это не так.
Google ничего не нашел, так что, видимо, я один из первых, кто столкнулся с этим.
Вопрос в том, КАК я могу с этим справиться?
1 ответ
Между 1.3.6 и 2.х произошли различные изменения в механизме связывания данных. Первое, что я бы попробовал, это дать свойствам объекта команды правильные типы, а не просто def
class ExperimentalCommand{
String id
String target
String action
String controller
}
Документы Grails 2.1.1 для привязки данных говорят о new CommandObject(params)
а также obj.properties = params
формы привязки данных и заявляют, что
Эти формы привязки данных в Grails очень удобны, но также и неразборчивы. Другими словами, они будут связывать все нетипичные, типизированные [my bold] свойства экземпляра целевого объекта, включая те, которые вы, возможно, не хотите связывать.