Подтвердить что ты не робот

Grails: найдите класс домена по названию

Я хочу разрешить пользователям перемещаться по классам домена и распечатывать отвалы. Моя проблема с frist: при условии, что следующие работы просто прекрасны:

//this works
class EasyStuffController{
  def quickStuff = {
    def findAThing = MyDomainClass.findByStuff(params.stuff)
    [foundThing:findAThing]
  }
}

Каков правильный способ написать то, что я пытаюсь сказать ниже:

//this doesn't
class EasyStuffController{ servletContext ->
  def quickStuff = {
    def classNameString = "MyDomainClass" //or params.whichOne something like that
    def domainHandle = grailsApplication.domainClasses.findByFullName(classNameString)
    //no such property findByFullName
    def findAThing = domainHandle.findByStuff(params.stuff)
    [foundThing:findAThing]
  }
}



//this also doesn't
class EasyStuffController{ servletContext ->
  def quickStuff = {
    def classNameString = "MyDomainClass" //or params.whichOne something like that
    def domainHandle 
    grailsApplication.domainClasses.each{
      if(it.fullName==classNameString)domainHandle=it
    }
    def findAThing = domainHandle.findByStuff(params.stuff)
    //No signature of method: org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass.list() is applicable
    [foundThing:findAThing]
  }
}

Эти строки выше не работают вообще. Я пытаюсь дать пользователям возможность выбирать любой класс домена и возвращать вещь с помощью "материала". Предположение: все классы домена имеют поле Stuff того же типа.

4b9b3361

Ответ 1

Если вы знаете полный пакет, вы можете использовать это:

String className = "com.foo.bar.MyDomainClass"
Class clazz = grailsApplication.getDomainClass(className).clazz
def findAThing = clazz.findByStuff(params.stuff)

Это также будет работать, если вы не используете пакеты.

Если вы используете пакеты, но пользователи будут предоставлять имя класса без пакета, а имена будут уникальными для всех пакетов, вы можете использовать это:

String className = "MyDomainClass"
Class clazz = grailsApplication.domainClasses.find { it.clazz.simpleName == className }.clazz
def findAThing = clazz.findByStuff(params.stuff)