2016-10-21 9 views
2

内の注釈を構築するために:私は以下のコードを試みた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"); 

This testが参考になります。

+0

私は以下の結果を得る: @NamedQueries( = @NamedQuery(名前= "E.findAll"、クエリ= "E EからEを選択") ) をしかし、私はNamedQuery @ @NamedQueriesを({(必要name = "E.findAll"、query = "SELECT e FROM E e")}) の代わりにかっこを追加することができます – RedArrow

関連する問題