Запросить параметры, не привязанные к объекту команды 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] свойства экземпляра целевого объекта, включая те, которые вы, возможно, не хотите связывать.

Другие вопросы по тегам