2013-07-24 1 views
2

Я пытаюсь добавить аннотацию @JsonTypeInfo к моим классам, используя AST во время компиляции.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" 

Как правильно передать в значение Enum в процессе преобразования AST? Пытаться передать значения напрямую (т. Е. Использовать CLASS или 1) не работает.

Просматривая другие Expression занятий отсюда: http://groovy.codehaus.org/api/org/codehaus/groovy/ast/expr/Expression.html, я думаю, возможно, FieldExpression выполнит эту работу, но я не смог заставить ее работать.

ответ

3

Глядя в AST браузер для класса с аннотацией JsonTypeInfo (как в вашем примере аннотацию выше), Вы получаете:

use: [email protected] [ 
     object: org.codehaus.[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', но вот и все! 'an.addMember (« use », новое PropertyExpression ( ) новое ClassExpression (новый ClassNode (com.fasterxml.jackson.annotation.JsonTypeInfo.Id.class)), новое ConstantExpression (JsonTypeInfo.Id.CLASS));' – divillysausages

+0

Оно работает! Я люблю вас, ребята! Я люблю тебя так сильно! –

Смежные вопросы