Как мне получить тип (класс) свойства доменного объекта Grails?

StackOverflow https://stackoverflow.com/questions/973992

Вопрос

Я пытаюсь динамически создавать объекты домена в Grails и столкнулся с проблемой, заключающейся в том, что для любого свойства, ссылающегося на другой объект домена, metaproperty сообщает мне, что его тип "java.lang.Объект", а не ожидаемый тип.

Например:

class PhysicalSiteAssessment {
    // site info
    Site site
    Date sampleDate
    Boolean rainLastWeek
    String additionalNotes
    ...

является началом класса домена, который ссылается на другой класс домена "Site".

Если я попытаюсь динамически найти типы свойств для этого класса с помощью этого кода (в сервисе):

String entityName = "PhysicalSiteAssessment"
Class entityClass
try {
    entityClass = grailsApplication.getClassForName(entityName)
} catch (Exception e) {
    throw new RuntimeException("Failed to load class with name '${entityName}'", e)
}
entityClass.metaClass.getProperties().each() {
    println "Property '${it.name}' is of type '${it.type}'"
}

тогда результатом будет то, что он распознает классы Java, но не доменный класс Grails.Выходные данные содержат следующие строки:

Property 'site' is of type 'class java.lang.Object'
Property 'siteId' is of type 'class java.lang.Object'
Property 'sampleDate' is of type 'class java.util.Date'
Property 'rainLastWeek' is of type 'class java.lang.Boolean'
Property 'additionalNotes' is of type 'class java.lang.String' 

Проблема в том, что я хотел бы использовать динамический поиск для поиска совпадающих объектов, напримерсделайте

def targetObjects = propertyClass."findBy${idName}"(idValue)

если класс свойств извлекается с помощью самоанализа, idName - это имя свойства для поиска (не обязательно идентификатор базы данных), а idValue - это значение для поиска.

Все это заканчивается в:

org.codehaus.groovy.runtime.InvokerInvocationException: groovy.lang.MissingMethodException: No signature of method: static java.lang.Object.findByCode() is applicable for argument types: (java.lang.String) values: [T04]

Есть ли способ найти фактический класс домена для свойства?Или, может быть, какое-то другое решение проблемы поиска экземпляра доменного класса, тип которого не указан (только имя свойства, которое имеет этот тип)?

Это работает, если я использую соглашение о том, что имя типа - это имя свойства с заглавной буквы ("site"->"Сайт") для поиска класса через экземпляр grailsApplication, но я хотел бы избежать этого.

Это было полезно?

Решение

Grails позволяет вам получить доступ к некоторой метаинформации вашей модели предметной области через экземпляр grailsApplication.Вы можете посмотреть на это таким образом:

import org.codehaus.groovy.grails.commons.ApplicationHolder
import org.codehaus.groovy.grails.commons.DomainClassArtefactHandler

def grailsApplication = ApplicationHolder.application
def domainDescriptor = grailsApplication.getArtefact(DomainClassArtefactHandler.TYPE, "PhysicalSiteAssessment")

def property = domainDescriptor.getPropertyByName("site")
def type = property.getType()
assert type instanceof Class

API:

Другие советы

Приведенный выше ответ, предоставленный Siegfried, устарел где-то около Grails 2.4.ApplicationHolder устарел.

Теперь вы можете получить реальные имена типов из Доменный класс свойство, которым обладает каждый доменный класс.

entityClass.domainClass.getProperties().each() {
    println "Property '${it.name}' is of type '${it.type}'"
}

Примечание:этот ответ не относится непосредственно к вопросу, но достаточно ИМО.

Я бился головой о стену, землю и окружающие деревья, пытаясь определить "общий тип" ассоциации коллекций:

class A {
    static hasMany = {
        bees: B
    }

    List bees
}

Оказалось, что самым простым и в то же время надежным способом был mere (и который я не пробовал, но через 3 часа):

A.getHasMany()['bees']
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top