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 требует строки; это выражение дает ошибку. Итак, как я могу получить рекурсивное выражение.

Можно ли создать еще одну аннотацию внутри аннотации?


person RedArrow    schedule 21.10.2016    source источник


Ответы (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");

Этот тест отличный источник примеров.

person Jesse Wilson    schedule 22.10.2016
comment
Я получаю результат ниже: д)}) вместо равенства можно добавить скобки, еще раз спасибо - person RedArrow; 22.10.2016