最初的问题
如果您有不同的方法,基本上只有一行不同,是否有一种方法可以通过创建一种方法使其干燥。
例子:
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);
}
那么,是否有一种方法可以制作一个方法并简单地作为参数传递:
- 领域类
- 要搜索的 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);
}
剩下的问题只有:
- 如何进一步清理/使其更清洁。
如何绕过警告:
[ApiController] 中的 [findAndShow] 操作接受 [groovy.lang.Closure] 类型的参数。不支持接口类型和抽象类类型作为命令对象。该参数将被忽略。
def findAndShow(Closure closure, def id, def p)