2

@JsonTypeInfoコンパイル時に 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 値を適切に渡すにはどうすればよいですか? CLASS値を直接 ( orを使用して) 渡そうとして1もうまくいきません。

ここから他のExpressionクラスを見る: http://groovy.codehaus.org/api/org/codehaus/groovy/ast/expr/Expression.htmlFieldExpression 、おそらく仕事をするだろうと思いますが、できませんでしたそれを機能させます。

4

1 に答える 1

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 ) ) )

しかし、私はそれをテストしておらず、ゴミを話しているかもしれません:-/

于 2013-07-24T12:08:05.850 に答える