2013-01-24 30 views
7

Tôi đang cố gắng lồng ghép chú thích động sẽ thêm chú thích @XmlElement vào mọi trường trong một lớp bằng cách sử dụng lập trình meta và AST. Tôi đang gặp sự cố khi tạo chú thích và áp dụng chúng cho các trường đúng cách.Groovy AST - Thêm chú thích khi biên dịch

Mã tôi có được định dạng ở đây: 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 
} 

Am i tiếp cận này hoàn toàn sai? Lý do tôi làm điều này là tôi có một tên miền mà vẫn còn trong việc tạo ra và tôi muốn chỉ cần đi vào và áp dụng các chú thích cho tất cả các lĩnh vực. Không thể tìm thấy bất kỳ ví dụ về chú thích nào được thêm vào trong quá trình biên dịch. Điều này là không thể?

+0

Bạn đang nói rằng bạn áp dụng chú thích cho tên miền. Có phải các lớp miền Grails không? Ý tôi là bạn sẽ sử dụng chú thích của mình trong môi trường Grails? – chanwit

+0

Có, tôi sẽ sử dụng một số chú thích XML JAXB để tạo ra một dịch vụ SOAP. Những gì tôi muốn là có chú thích WebresourceAnnotation sẽ đi qua mọi trường trong đối tượng miền và thêm chú thích XmlElement đơn giản. – Elotin

Trả lời

1

Viết mã bằng cách sử dụng Groovy AST Transformation một mình không hoạt động với cơ chế nạp lại Grails. Đây là một cách thích hợp để thực hiện chuyển đổi AST cho ứng dụng Grails.

  1. Lớp biến áp của bạn phải mở rộng AbstractGrailsArtefactTransformer.
  2. Lớp biến áp của bạn phải được chú thích bởi @AstTransformer.
  3. Bạn phải đặt lớp học theo org.codehaus.groovy.grails.compiler hoặc gói phụ của gói đó. Trong trường hợp của tôi, tôi sử dụng org.codehaus.groovy.grails.compiler.zk và nó hoạt động tốt.
  4. Triển khai shouldInject() để chỉ đối sánh các lớp bạn muốn, trong trường hợp này là các lớp miền.
  5. Ghi đè performInjection() và viết mã của bạn ở đó.
  6. Gói các lớp biến áp và xếp lớp của bạn thành một tệp .jar hoặc trình biên dịch Grails không tải nó.
+0

Cảm ơn rất nhiều. Tôi sẽ xem xét nó và xem những gì tôi có thể tìm ra. Tôi đã bị cuốn vào không chắc chắn làm thế nào để thực sự tạo ra một AnnotationNode. – Elotin

+0

Không sao cả. Đừng quên chấp nhận nó như là câu trả lời sau khi bạn đã biến máy của bạn làm việc :) – chanwit

Các vấn đề liên quan