Я пытаюсь добавить аннотацию @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
выполнит эту работу, но я не смог заставить ее работать.
Чтобы изменить 'ClassExpression', вы получите' ClassNode', но вот и все! 'an.addMember (« use », новое PropertyExpression ( ) новое ClassExpression (новый ClassNode (com.fasterxml.jackson.annotation.JsonTypeInfo.Id.class)), новое ConstantExpression (JsonTypeInfo.Id.CLASS));' – divillysausages
Оно работает! Я люблю вас, ребята! Я люблю тебя так сильно! –