2016-10-21 3 views
2

ich versuche, den Ausdruck mit Anmerkung unten zu generieren:JavaPoet: Wie Anmerkung innerhalb Anmerkung zu bauen

@NamedQueries({@NamedQuery(name = "E.findAll", query = "SELECT e FROM E e")}) 

ich den Code versucht, unten:

.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()) 

aber da addMember erfordert string; Dieser Ausdruck gibt einen Fehler. Wie kann ich einen rekursiven Ausdruck erhalten?

Ist es möglich, eine Annotation in einer Annotation zu erstellen?

Antwort

1

Ja. Verwenden Sie $L und übergeben Sie eine 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"); 

This test ist eine großartige Quelle für Beispiele.

+0

ich erhalten das Ergebnis unter: @NamedQueries ( = @NamedQuery (name = "E.findAll", query = "SELECT e FROM E e") ) aber ich brauche @NamedQueries ({@ NamedQuery (name = "E.findAll", query = "SELECT e FROM E")}) anstelle von Gleichheit ist es möglich, Klammern hinzuzufügen, danke nochmal – RedArrow