JavaPoet: как создать аннотацию внутри аннотации

#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»)}) вместо равенства можно ли добавить круглые скобки, еще раз спасибо