Groovy AST - 使用枚举添加类注释

时间:2013-07-24 11:13:54

标签: groovy annotations abstract-syntax-tree

我正在尝试在编译期间使用AST将@JsonTypeInfo注释添加到我的类中。

要添加的注释应该是(使用类作为示例):

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="className")

JsonTypeInfo.Id定义为:

public enum Id {
    NONE(null),
    CLASS("@class"),
    MINIMAL_CLASS("@c"),
    NAME("@type"),
    CUSTOM(null)
    ;
}

JsonTypeInfo.As定义为:

public enum As {
    PROPERTY,
    WRAPPER_OBJECT,
    WRAPPER_ARRAY,
    EXTERNAL_PROPERTY
    ;
}

都在JsonTypeInfo类内。

要添加注释,我有一个函数setJson(),如下所示:

public static void setJson(ClassNode cn)
{
    AnnotationNode an = new AnnotationNode( new ClassNode(com.fasterxml.jackson.annotation.JsonTypeInfo.class));

    an.addMember("use", new ConstantExpression(JsonTypeInfo.Id.CLASS));
    an.addMember("include", new ConstantExpression(JsonTypeInfo.As.PROPERTY));
    an.addMember("property", new ConstantExpression("className"));

    cn.addAnnotation(an);
}

但是,似乎只设置property成员没有问题。当我跑完剩下的时候,我会收到像

这样的错误
"Expected enum value for attribute use in @com.fasterxml.jackson.annotation.JsonTypeInfo"

如何在AST转换期间正确传入Enum值?尝试直接传递值(即使用CLASS1)不起作用。

从这里查看其他Expression课程:http://groovy.codehaus.org/api/org/codehaus/groovy/ast/expr/Expression.html,我想也许FieldExpression可以完成这项工作,但我无法让它发挥作用。

1 个答案:

答案 0 :(得分:3)

在AST浏览器中查找使用JsonTypeInfo注释的类(如上面的示例注释中所示),您将获得:

use: org.codehaus.groovy.ast.expr.PropertyExpression@7f78be49 [
         object: org.codehaus.groovy.ast.expr.ClassExpression@5014ec00[
                     type: com.fasterxml.jackson.annotation.JsonTypeInfo$Id
         ]
         property: ConstantExpression[CLASS]
     ]

这让我相信:

an.addMember("use", new ConstantExpression(JsonTypeInfo.Id.CLASS));

应该是:

an.addMember("use", new PropertyExpression(
                      new ClassExpression( JsonTypeInfo.Id ),
                      new ConstantExpression( JsonTypeInfo.Id.CLASS ) ) )

但我没有测试过,可能会说垃圾: - /