2013-01-24 65 views
7

我試圖動態地創建一個註解,它將動態地向使用元編程和AST的類中的每個字段添加@XmlElement註釋。我在創建註釋並將它們正確應用於字段時遇到了問題。Groovy AST-在編譯時添加註釋

的代碼,我在這裏格式: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

是的,我將使用一些JAXB XML註釋來生成SOAP服務。我想要的是讓WebresourceAnnotation註釋將通過域對象中的每個字段並添加一個普通的XmlElement註釋。 – Elotin

回答

1

單獨使用Groovy AST Transformation編寫代碼不適用於Grails重載機制。這是一個爲Grails應用程序實現AST轉換的正確方法。

  1. 您的變壓器類別必須延伸AbstractGrailsArtefactTransformer
  2. 您的變壓器類別必須註明@AstTransformer
  3. 您的課程必須置於org.codehaus.groovy.grails.compiler或其子包裝內。在我的情況下,我使用org.codehaus.groovy.grails.compiler.zk,它工作正常。
  4. 執行shouldInject()只匹配你想要的類,在這種情況下是域類。
  5. 覆蓋performInjection()並在那裏寫你的代碼。
  6. 你的變壓器和相關類到.jar文件,或Grails編譯器不加載它。
+0

非常感謝。我會看看它,看看我能弄清楚什麼。我陷入了不確定如何實際創建一個AnnotationNode。 – Elotin

+0

沒問題。不要忘記接受它作爲你的變壓器工作後的答案:) – chanwit