#java #javapoet
#java #javapoet
Вопрос:
Я пытаюсь сгенерировать выражение с аннотацией ниже:
@NamedQueries({@NamedQuery(name = "E.findAll", query = "SELECT e FROM E e")})
Я попробовал приведенный ниже код:
.addAnnotation(AnnotationSpec.builder(NamedQueries.class)
.addMember( AnnotationSpec.builder(NamedQuery.class)
.addMember("name", "$S", "E.findAll")
.addMember("query", "$S", "SELECT e FROM E e)
.build()).build())
но поскольку addMember
требуется строка; это выражение выдает ошибку. Итак, как я могу получить рекурсивное выражение.
Возможно ли создать другую аннотацию внутри аннотации?
Ответ №1:
Да. Используйте $L
и передайте, что AnmotationSpec.
ClassName beef = ClassName.get(tacosPackage, "Beef");
ClassName chicken = ClassName.get(tacosPackage, "Chicken");
ClassName option = ClassName.get(tacosPackage, "Option");
ClassName mealDeal = ClassName.get(tacosPackage, "MealDeal");
TypeSpec menu = TypeSpec.classBuilder("Menu")
.addAnnotation(AnnotationSpec.builder(mealDeal)
.addMember("price", "$L", 500)
.addMember("options", "$L", AnnotationSpec.builder(option)
.addMember("name", "$S", "taco")
.addMember("meat", "$T.class", beef)
.build())
.addMember("options", "$L", AnnotationSpec.builder(option)
.addMember("name", "$S", "quesadilla")
.addMember("meat", "$T.class", chicken)
.build())
.build())
.build();
assertThat(toString(menu)).isEqualTo(""
"package com.squareup.tacos;n"
"n"
"@MealDeal(n"
" price = 500,n"
" options = {n"
" @Option(name = "taco", meat = Beef.class),n"
" @Option(name = "quesadilla", meat = Chicken.class)n"
" }n"
")n"
"class Menu {n"
"}n");
Этот тест является отличным источником примеров.
Комментарии:
1. Я получаю результат ниже: @NamedQueries( = @NamedQuery(name = «E.findAll», запрос = «ВЫБЕРИТЕ e Из E e») ) но мне нужны @NamedQueries({@NamedQuery(name = «E.findAll», запрос = «ВЫБЕРИТЕ e ИЗ E e»)}) вместо равенства можно ли добавить круглые скобки, еще раз спасибо