メタプログラミングと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
}
私は、これがすべて間違って近づいているだろうか?私はこれを行う理由は、私はまだ作っているドメインを持っていると私はちょうど入って、すべてのフィールドに注釈を適用したいと思います。コンパイル中に追加されたアノテーションの例は見つかりませんでした。これは不可能ですか?
アノテーションをドメインに適用しているとします。 Grailsのドメインクラスですか? Grails環境でアノテーションを使用するつもりですか? – chanwit
はい私はSOAPサービスを生成するためにいくつかのJAXB XMLアノテーションを使用します。私が望むのは、ドメインオブジェクトのすべてのフィールドを通過し、プレーンなXmlElementアノテーションを追加するWebresourceAnnotationアノテーションを持つことです。 – Elotin