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

그루비 AST 변환만을 사용한 코드 작성은 Grails 리로딩 메커니즘에서 작동하지 않습니다. 다음은 Grails 애플리케이션을위한 AST 변환을 구현하는 적절한 방법입니다.

  1. 변압기 등급은 AbstractGrailsArtefactTransformer입니다.
  2. 변압기 등급은 @AstTransformer으로 주석되어야합니다.
  3. 클래스는 org.codehaus.groovy.grails.compiler 또는 그 하위 패키지에 속해야합니다. 제 경우에는 org.codehaus.groovy.grails.compiler.zk을 사용하고 있습니다.
  4. 을 구현하여 원하는 클래스 (이 경우 도메인 클래스)와 일치시킵니다.
  5. performInjection()을 덮어 쓰고 코드를 작성하십시오.
  6. 변압기 및 관련 클래스를 .jar 파일로 가져 오거나 Grails 컴파일러가로드하지 않습니다.
+0

고마워요. 나는 그것을보고 내가 알아낼 수있는 것을 보게 될 것이다. AnnotationNode를 실제로 생성하는 방법을 모르는 것에 너무 빠져 들었습니다. – Elotin

+0

문제 없습니다. 트랜스포머를 작동시킨 후에 대답으로 받아 들여야합니다. :) – chanwit

관련 문제