2013-07-24 57 views
2

我試圖在編譯期間使用AST將@JsonTypeInfo註釋添加到我的類中。Groovy AST - 使用枚舉添加類註解

添加應該出來作爲(使用類作爲示例)註解:

@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會完成這項工作,但是我一直無法完成這項工作。

回答

3

展望AST的瀏覽器與JsonTypeInfo註釋(如上面的例子註釋)一類,你得到:

use: [email protected] [ 
     object: [email protected][ 
        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))) 

但我沒有測試過它,可能是在說垃圾: -/

+0

不得不修改'ClassExpression'來取'ClassNode',但就是這樣!新的PropertyExpression( )新的ClassExpression(新的ClassNode(com.fasterxml.jackson.annotation.JsonTypeInfo.Id.class)), new ConstantExpression(JsonTypeInfo.Id.CLASS)));' – divillysausages

+0

有用!我愛你們!我那麼愛你! –