2013-01-24 18 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

はい私はSOAPサービスを生成するためにいくつかのJAXB XMLアノテーションを使用します。私が望むのは、ドメインオブジェクトのすべてのフィールドを通過し、プレーンなXmlElementアノテーションを追加するWebresourceAnnotationアノテーションを持つことです。 – Elotin

答えて

1

Groovy ASTによるコードの記述だけでは、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

関連する問題