Как получить доступ к объектам команд из фильтра и возможно ли это вообще?
Я часто пишу что-то вроде:
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 ответа
Нет, невозможно сделать то, что вы просите. Командные объекты не являются полными объектными артефактами, такими как Controller, Service и т. Д., И поэтому к ним не добавляется логика проверки, если они не являются параметром для действия Controller. Для этого объект Command в фильтре не будет иметь .validate()
или же .hasErrors()
метод для проверки.
В качестве другого варианта вы можете использовать @Validateable
аннотация:
http://grails.org/doc/latest/guide/7.%20Validation.html
Переместите ваш командный объект в 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.
Как насчет создания сервиса, подобного этому:
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
}
}
}