2013-01-24 22 views
7

मैं गतिशील रूप से एक एनोटेशन को क्रेट करने की कोशिश कर रहा हूं जो गतिशीलता मेटाप्रोग्रामिंग और एएसटी का उपयोग कर कक्षा में प्रत्येक फ़ील्ड में @XmlElement एनोटेशन जोड़ देगा। मुझे एनोटेशन बनाने और उन्हें खेतों में सही तरीके से लागू करने में समस्याएं आ रही हैं।ग्रोवी एएसटी - संकलन में एनोटेशन जोड़ना

कोड मैं यहाँ स्वरूपित है: http://pastebin.com/60DTX5Ya

import javax.xml.bind.annotation.XmlElement 

@GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION) 
class WebserviceAnnotationModifier implements ASTTransformation { 
@Override 
void visit(ASTNode[] astNodes, SourceUnit sourceUnit) { 

    if (!astNodes) return 
    if (!astNodes[0] || !astNodes[1]) return 
    if (!(astNodes[0] instanceof AnnotationNode)) return 
    if (!(astNodes[1] instanceof ClassNode)) return 
    ClassNode node = (ClassNode)astNodes[1] 
    List fields = node.getFields() 
    fields.each {FieldNode field -> 
     field.addAnnotation(ClassHelper.make(new XmlElement.DEFAULT())); 
    } 
} 
} 

@Retention(RetentionPolicy.SOURCE) 
@Target([ElementType.TYPE]) 
@GroovyASTTransformationClass(classes =[WebserviceAnnotationModifier]) 
public @interface WebresourceAnnotation{} 

@WebresourceAnnotation 
class TestPerson{ 
    String name; 
    String lastName; 
    int Age 
} 

मैं इस सब गलत आ रहा हूँ? कारण यह है कि मेरे पास एक डोमेन है जो अभी भी बनाने में है और मैं बस सभी क्षेत्रों में एनोटेशन लागू करना चाहता हूं। संकलन के दौरान जोड़े गए एनोटेशन के कोई उदाहरण नहीं मिल सका। यह संभव नहीं है?

+0

आप कह रहे हैं कि आप डोमेन पर एनोटेशन लागू कर रहे हैं। क्या यह Grails डोमेन कक्षाओं है? मेरा मतलब है कि आप Grails पर्यावरण में अपनी एनोटेशन का उपयोग करने जा रहे हैं? – chanwit

+0

हां मैं एक एसओएपी सेवा उत्पन्न करने के लिए कुछ जेएक्सबी एक्सएमएल एनोटेशन का उपयोग करूँगा। मैं चाहता हूं कि WebresourceAnnotation एनोटेशन है जो डोमेन ऑब्जेक्ट में प्रत्येक फ़ील्ड के माध्यम से जाएगा और एक सादा XmlElement एनोटेशन जोड़ें। – Elotin

उत्तर

1

अकेले ग्रोवी एएसटी परिवर्तन का उपयोग करके कोड लिखना Grails रीलोडिंग तंत्र के साथ काम नहीं करता है। Grails ऐप के लिए एएसटी परिवर्तन को लागू करने का एक उचित तरीका यहां दिया गया है।

  1. आपकी ट्रांसफॉर्मर कक्षा AbstractGrailsArtefactTransformer को विस्तारित करनी चाहिए।
  2. आपकी ट्रांसफार्मर कक्षा @AstTransformer द्वारा एनोटेटेड होनी चाहिए।
  3. आपको कक्षा org.codehaus.groovy.grails.compiler या उसके उप-पैकेज के तहत रखा जाना चाहिए। मेरे मामले में मैं org.codehaus.groovy.grails.compiler.zk का उपयोग करता हूं और यह ठीक काम कर रहा है।
  4. इस मामले में डोमेन कक्षाओं में केवल इच्छित कक्षाओं से मेल खाने के लिए shouldInject() लागू करें।
  5. performInjection() ओवरराइड करें और वहां अपने कोड लिखें।
  6. पैक अपने ट्रांसफार्मर और कक्षाओं को में रिलीज़ किया गया .jar फ़ाइल, या Grails संकलक इसे लोड नहीं करता है।
+0

बहुत बहुत धन्यवाद। मैं इसे देख लूंगा और देख सकता हूं कि मैं क्या समझ सकता हूं। मैं यह सुनिश्चित नहीं कर पाया कि वास्तव में एनोटेशन नोड कैसे बनाया जाए। – Elotin

+0

कोई समस्या नहीं है। अपने ट्रांसफॉर्मर को काम करने के बाद जवाब के रूप में इसे स्वीकार करना न भूलें :) – chanwit