Я использую Grails 2.4.3, и я пытаюсь создать динамический абстрактный контроллер класса домена, который содержит несколько стандартных методов, которые могут использоваться каждым классом домена.Динамический абстрактный контроллер Grails
Так что я создал DomainClassController
abstract class DomainClassController {
def domainClassSearchService
def domainClass = Foo
ApplicationContext context = ServletContextHolder.servletContext.getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT) as ApplicationContext
ConfigObject config = context.getBean(GrailsApplication).config
def index() {
if (!domainClass)
return render(text: 'fehler', status: INTERNAL_SERVER_ERROR)
def list = domainClassSearchService.list(params, domainClass, params.max, params.offset, params.sort, params.order)
Integer count = domainClassSearchService.count(params, domainClass)
render view: 'index', model: [list: list, count: count]
}
def search() {
if (!domainClass)
return render(text: 'fehler', status: INTERNAL_SERVER_ERROR)
def list = domainClassSearchService.list(params, domainClass, params.max, params.offset, params.sort, params.order)
Integer count = domainClassSearchService.count(params, domainClass)
render template: 'list', model: [list: list, count: count, params: params]
}
}
Теперь Я хочу BarController
, что расширяет DomainClasscontroller
:
class BarController extends DomainClassController {
def domainClass = Bar
}
Как я могу установить domainClass в каждом контроллере, что абстрактный контроллер может использовать его для индекс и метод поиска?
EDIT
Я сделал это так, как это описано в ответе, чтобы получить его работу. Но теперь я хочу, чтобы сделать метод создания динамики, так что я добавил это:
def create(){
def domainClassObject = getDomainClass()?.newInstance()
domainClassObject.properties = params
return render(view: getViewPath() + 'create', model: [domainClass: domainClassObject])
}
Эта работа также на себя, но я не хочу, чтобы использовать в GSP свойство domainClass
. Я хочу использовать имя класса в Lower Cas, так что f.e. foo
для класса Foo
и bar
для класса Bar
на вид.
Как я могу установить имя модели для ClassName в lowerCase?
Вместо свойства вы можете использовать абстрактный метод. –
Не связанный с вашей проблемой, а вместо 'ApplicationContext context = ServletContextHolder.servletContext.getAttribute (GrailsApplicationAttributes.APPLICATION_CONTEXT) в качестве ApplicationContext' и' ConfigObject config = context.getBean (GrailsApplication) .config' вы могли бы упростить это путем реализации «GrailsConfigurationAware» и инициализируя свойство 'config' в методе' setConfiguration'. В вашем примере даже не используется 'config', поэтому не понятно, зачем вам это нужно. –