Question

Je suis en train de créer dynamiquement des objets de domaine dans Grails et rencontré le problème que pour les biens faisant référence objet d'un autre domaine le métapropriété me dit son type est « java.lang.Object » et non le type attendu.

Par exemple:

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

est le début d'une classe de domaine, qui fait référence à une autre classe de domaine « du site ».

Si j'essaie de trouver dynamiquement les types de propriétés de cette classe en utilisant ce code (dans un service):

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}'"
}

alors le résultat est qu'il reconnaît les classes Java, mais pas la classe de domaine Grails. La sortie contient les lignes suivantes:

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' 

Le problème est que je voudrais utiliser la recherche dynamique pour trouver des objets correspondant, par exemple faire

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

où le propertyClass est récupéré par l'introspection, idName est le nom de la propriété pour rechercher (pas nécessairement l'ID de base de données) et idValue est la valeur à trouver.

Tout se termine par:

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]

Y at-il un moyen de trouver la classe de domaine réel pour la propriété? Ou peut-être une autre solution au problème de trouver une instance d'une classe de domaine dont le type n'est pas donné (seulement un nom de propriété qui a le type)?

Il fonctionne si j'utilise la convention que le nom du type est le nom de la propriété capitalisé ( « site » -> « Site »). Pour rechercher la classe par l'instance grailsApplication, mais je voudrais éviter que

Était-ce utile?

La solution

Grails vous permet d'accéder à certaines méta-informations de votre modèle de domaine par l'instance GrailsApplication. Vous pouvez le regarder de cette façon:

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:

Autres conseils

La réponse ci-dessus fournies par Siegfried est devenu obsolète quelque part autour de Grails 2.4. ApplicationHolder est obsolète.

Maintenant, vous pouvez obtenir de vrais noms de type de la propriété domainClass que chaque classe de domaine a.

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

Note:. Cette réponse est pas directement à la question, mais se rapporte assez OMI

je frappais ma tête sur le mur, le sol et les arbres environnants en essayant de résoudre le « type générique » d'une association de collection:

class A {
    static hasMany = {
        bees: B
    }

    List bees
}

Retourné la meilleure façon et pourtant son était simple (et que je ne l'ai pas essayé, mais au bout de 3 heures):

A.getHasMany()['bees']
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top