Как получить доступ к объектам команд из фильтра и возможно ли это вообще? - PullRequest
2 голосов
/ 15 сентября 2011

Я часто пишу что-то вроде:



    def myAction{ MyActionCommand cmd ->
       if( cmd.hasErrors() ){
          return render(status:HttpServletResponse.SC_BAD_REQUEST );
       }else{
          // actual action logic
       }


Итак, я хотел бы извлечь этот общий шаблон в какое-то место для повторного использования. Фильтр выглядит хорошим кандидатом, но я не могу найти способ получить объект команды из фильтра. Пробовал что-то вроде этого (в фильтрах закрытия):



    formValidation( controller:'*', action:'*' ){
       before = { cmd ->
          if( cmd.hasErrors() ){
              response.sendError( HttpServletResponse.SC_BAD_REQUEST );
              return false;
          }else{
              return true;
          }
       }
    }


Помещенный в Грааль 1.3.7 совместимый раствор. Возможно ли это вообще?

Ответы [ 2 ]

1 голос
/ 15 сентября 2011

Нет, невозможно сделать то, что вы просите. Объекты команд не являются полными объектными артефактами, такими как Controller, Service и т. Д., И поэтому к ним не добавляется логика проверки, если они не являются параметром действия Controller. Для этого объект Command в фильтре не будет иметь метода .validate() или .hasErrors() для проверки.

В качестве другого варианта вы можете использовать аннотацию @Validateable:

http://grails.org/doc/latest/guide/7.%20Validation.html#7.5%20Validation%20Non%20Domain%20and%20Command%20Object%20Classes

Переместите ваш объект Command в src/groovy как обычный класс Groovy и добавьте к нему @Validateable. Тогда в вашем фильтре вы можете сделать:

def validObj = new MyValidateable(params)
if (!validObj.validate()) {
    response.sendError( HttpServletResponse.SC_BAD_REQUEST );
    return false;
} else {
    return true;
}

Убедитесь, что вы добавили имя пакета вашего проверяемого класса в список grails.validateable.packages в Config.groovy.

0 голосов
/ 15 сентября 2011

А как насчет создания такого сервиса:

class AutoValidateService {
    def onValid(def cmd, Closure onValid) {
        if( cmd.hasErrors() ){
            return render(status:HttpServletResponse.SC_BAD_REQUEST );
        }else{
            onValid()
        }
    }
}

Использование это так:

class FooController {

    AutoValidateService autoValidateService

    def myAction{ MyActionCommand cmd ->
        autoValidateService.onValid(cmd) {
            // do something
        }
    }
}
...