Исходная проблема
Если у вас есть разные методы, которые в основном отличаются только одной строкой, есть ли способ сделать его СУХИМ, создав один метод.
Пример:
def showA( ) {
def instance
try {
instance = A.findById( params.id )
} catch ( Exception e ) {
def message = "Error while retrieving details for the given id ${ params.id }, $e"
log.error message
responseAsJson( 400, "Invalid id", message )
return false
}
return checkAndRender(instance, params.id);
}
def showB( ) {
def instance
try {
instance = B.findByBId( params.BId )
} catch ( Exception e ) {
def message = "Error while retrieving details for the given id ${ params.id }, $e"
log.error message
responseAsJson( 400, "Invalid id", message )
return false
}
return checkAndRender(instance, params.id);
}
Итак, есть ли способ создать один метод и просто передать его как параметр:
- Класс домена
- идентификатор для поиска
Или было бы лучше вместо этого передать оператор SQL?
Обновлять
Основываясь на комментарии @dmahapatro, я придумал следующее:
def showA( ) {
def clos = {id -> A.findByAId( id ) }
return findAndShow(clos, params.AId, params )
}
def showB( ) {
def clos = {id -> B.findByBId( id ) }
return findAndShow(clos, params.BId, params )
}
def findAndShow(Closure closure, def id, def p)
{
def instance
try {
instance = closure(id)
}
catch ( Exception e ) {
def message = "Error while retrieving instance details for the given id ${ id }, $e"
log.error message
responseAsJson( 400, "Invalid Id", message )
return false
}
return checkAndRender(instance, id);
}
Остались только проблемы:
- Как очистить еще больше / сделать его чище.
- #P7# <цитата> #P8#
цитата>def findAndShow(Closure closure, def id, def p)
tryCatchClosure
. - person dmahapatro   schedule 03.12.2014The [findAndShow] action in [ApiController] accepts a parameter of type [groovy.lang.Closure]. Interface types and abstract class types are not supported as command objects. This parameter will be ignored.
Вопрос об обновлении. def findAndShow (закрытие закрытия, идентификатор защиты, защита p) - person Menelaos   schedule 03.12.2014findAndShow { B.findByBId(params.id) }
(Groovy неявно возвращает значение последней команды) иtry { instance = closure() }
- person Gregor Petrin   schedule 03.12.2014