7

メタプログラミングと AST を使用して、クラス内のすべてのフィールドに @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
}

私はこれにすべて間違って近づいていますか?私がこれを行う理由は、まだ作成中のドメインがあり、すべてのフィールドに注釈を適用したいからです。コンパイル中に追加された注釈の例が見つかりませんでした。これは不可能ですか?

4

1 に答える 1

1

Groovy AST Transformation だけを使用してコードを記述しても、Grails のリロード メカニズムでは機能しません。Grails アプリに AST 変換を実装する適切な方法を次に示します。

  1. トランスフォーマー クラスは extends する必要がありますAbstractGrailsArtefactTransformer
  2. トランスフォーマー クラスには で注釈を付ける必要があります@AstTransformer
  3. クラスは、org.codehaus.groovy.grails.compilerまたはそのサブパッケージの下に配置する必要があります。私の場合、私は使用org.codehaus.groovy.grails.compiler.zkしており、正常に動作しています。
  4. shouldInject()必要なクラス (この場合はドメイン クラス) のみに一致するように実装します。
  5. performInjection()そこにコードをオーバーライドして記述します。
  6. トランスフォーマーと関連するクラスを.jarファイルにパックしないと、Grails コンパイラーはそれをロードしません。
于 2013-01-28T10:17:31.533 に答える