2009-06-10 14 views
14

मैं गतिशील रूप से Grails में डोमेन ऑब्जेक्ट्स बनाने की कोशिश कर रहा हूं और समस्या का सामना कर रहा हूं कि किसी अन्य डोमेन ऑब्जेक्ट का संदर्भ देने वाली किसी भी संपत्ति के लिए मेटाप्रोपर्टी मुझे बताती है कि इसका प्रकार "java.lang.Object" है और अपेक्षित प्रकार नहीं है।मैं Grails डोमेन ऑब्जेक्ट की किसी संपत्ति का प्रकार (वर्ग) कैसे प्राप्त करूं?

उदाहरण के लिए:

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

एक डोमेन वर्ग है, जो किसी अन्य डोमेन वर्ग "साइट" का संदर्भ की शुरुआत है।

अगर मैं गतिशील रूप से इस कोड (एक सेवा में) का उपयोग करके इस वर्ग के लिए संपत्ति प्रकार खोजने की कोशिश:

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

तो नतीजा यह है कि यह जावा वर्गों पहचानता है, लेकिन नहीं 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) 

जहां propertyClass आत्मनिरीक्षण के माध्यम से लिया गया है, 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] 

वहाँ संपत्ति के लिए वास्तविक डोमेन वर्ग को खोजने के लिए एक तरीका है? या हो सकता है कि किसी डोमेन क्लास का उदाहरण ढूंढने की समस्या का कोई अन्य समाधान जिसका प्रकार नहीं दिया गया है (केवल एक संपत्ति का नाम जिसमें प्रकार है)?

यह काम करता है अगर मैं इस सम्मेलन का उपयोग करता हूं कि प्रकार का नाम संपत्ति नाम पूंजीकृत ("साइट" -> "साइट") है, तो grails के माध्यम से कक्षा को देखने के लिए आवेदन उदाहरण, लेकिन मैं इससे बचना चाहता हूं।

उत्तर

15

Grails आपको GrailsAplication उदाहरण के माध्यम से अपने डोमेन मॉडल की कुछ मेटा-सूचना तक पहुंचने की अनुमति देता है। आप इसे देख सकते हैं कि जिस तरह से:

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 

एपीआई:

+0

धन्यवाद, यह काम करता है। क्या इस एपीआई का कहीं कुछ अवलोकन है? मैं ऐसा कुछ ढूंढ रहा था लेकिन उसे नहीं मिला। –

+0

कोई भी अच्छा संदर्भ नहीं है जिसे मैंने कभी भी javadocs (http://grails.org/doc/1.1/api/org/codehaus/groovy/grails/commons/DefaultGrailsApplication.html) के अलावा देखा है। मैं Grails Sourcecode को बहुत उपयोगी देख रहा हूं। मैं डोमेन ऑब्जेक्ट बाधाओं का निरीक्षण करने के लिए बिल्ड-टेस्ट-डेटा प्लगइन में इस प्रकार की सामग्री का भी भारी उपयोग करता हूं और यदि आप उदाहरणों की तलाश में हैं तो बाधाओं को पारित करने वाली टेस्ट ऑब्जेक्ट्स स्वचालित रूप से उत्पन्न करें (http://bitbucket.org/tednaleid/grails- परीक्षण डाटा/wiki/गृह)। –

+1

मैं इसके बजाय 'getDomainClass' को कॉल कर रहा हूं। 'grailsAplication.getDomainClass (PhysicalSiteAssessment) .getPropertyByName ('site')। टाइप करें –

0

नोट: यह उत्तर सीधे प्रश्न पर नहीं है लेकिन पर्याप्त आईएमओ से संबंधित है।

मैं दीवार, भूमि पर मेरे सिर पीटने गया था और पेड़ों के आसपास के जब एक संग्रह संघ के "सामान्य प्रकार" को हल करने की कोशिश कर रहा:

class A { 
    static hasMany = { 
     bees: B 
    } 

    List bees 
} 

पता चला सबसे आसान और अभी तक बिलकुल सही तरीका मात्र था (और जो मैं कोशिश नहीं की थी लेकिन 3 घंटे के बाद):

A.getHasMany()['bees'] 
2

जवाब Siegfried द्वारा प्रदान की ऊपर अप्रचलित हो गई कहीं 2.4 Grails। एप्लिकेशनहोल्डर अप्रचलित है।

अब, आप domainClass संपत्ति हर डोमेन वर्ग है कि से वास्तविक प्रकार के नाम प्राप्त कर सकते हैं।

entityClass.domainClass.getProperties().each() { 
    println "Property '${it.name}' is of type '${it.type}'" 
} 
संबंधित मुद्दे