无法使用AST转换将方法添加到GORM对象

时间:2015-02-02 18:25:26

标签: grails groovy gorm abstract-syntax-tree

这是我的GORM对象

@UpdatedProperties
class Cart {
    Date lastUpdated
    Date dateCreated

    String name 
}

这是注释定义:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@GroovyASTTransformationClass(["UpdatedPropertiesASTTransformation"])

public @interface UpdatedProperties {
}

这是AST定义

@GroovyASTTransformation(phase = CompilePhase.CLASS_GENERATION)
class UpdatedPropertiesASTTransformation implements ASTTransformation{
    //...

    public void visit(ASTNode[] astNodes, SourceUnit sourceUnit) {
        astNodes.findAll { node -> node instanceof ClassNode}.each {
        classNode ->
            def testMethodBody = new AstBuilder().buildFromString (
                    """
                    println(">>*************myMethod)";
                    """
            )

            def myMethod = new MethodNode('myMethod', ACC_PUBLIC, ClassHelper.VOID_TYPE, [] as Parameter[], [] as ClassNode[], testMethodBody[0])
            classNode.addMethod(myMethod)   
        }
    }
...
}

当我尝试调用我得到的方法时:

groovy.lang.MissingMethodException:没有方法签名:Cart.myMethod()适用于参数类型:()值:[]

任何提示赞赏。感谢

1 个答案:

答案 0 :(得分:1)

类生成在编译阶段为时已晚,在该阶段向类添加方法,因此您需要将编译阶段更改为语义分析或规范化。 (无论如何,这可能比你想要添加方法要晚得多。Groovy Compile Phase Guide

您的AST字符串中也存在一些问题。您的println中存在语法错误,println(">>*************myMethod)";应该是println(">>*************myMethod");,并且您需要添加明确的return;语句,因为您正在返回{ {1}}(否则Groovy会在方法的末尾添加void,这将与您的return null;返回类型冲突。