2015-01-19 3 views
0

Учитывая, что мы не можем создать иерархию annoations, why-is-not-possible-to-extend-annotations-in-javaКак объявить массив объектов в аннотации?

как decalare массив объекта для хранения упорядоченного списка различных аннотаций

public @interface View { 
    Object[] elements(); 
//Invalid type Object[] for the annotation attribute View.elements; only 
primitive type, String, Class, annotation, enumeration are permitted 
or 1-dimensional arrays thereof 
} 
Elements could be @Field, @Tab, @Listing .... but i need to know the order 

нужда является то, что у меня есть XML древовидная иерархия как этот

<view id="StkEntranceVoucher" name="StkEntranceVoucher" > 
    <listingHeader /> 
    <listing > 
     <ref mode="vp" target="titleText"/> 
     <ref mode="vp" target="voucherNumber"/>  
    </listing> 
    <panel> 
     <tab> 
     <tab>    
      <panel> 
       <field name="title" /> 
      </panel> 
      <field name="titleText" /> 
      <field name="voucherNumber"> 
     </tab> 
     </tab> 
    </panel> 
</view> 

я хочу, чтобы иметь возможность генерировать этот XML-конфигурации, с конфигурацией на эту заметку модели: я уже в состоянии сделать это

@View([email protected](orderBy="(?).id.num"), detailSize="580px", 
    [email protected](actions="printAll"), 
    listing={ "id.num", "reference", "onDate", "fromSection", "supplier", 
       "totalField", "buyOrder.id.num", "buyOrder.onDate", "receiptVcr.id.num", "receiptVcr.onDate", 
       "prdExitOrd.id.num", "prdExitOrd.onDate", "invExtract.id.num", "invExtract.onDate" }, 
    tabs={ 
     @Tab(name="GeneralTab", 
     SubTabs={ 
      @SubTab(name="HeaderTab", 
       style [email protected](type=StlType.print, colWidths={"50", "400"}, width="450", marginB=2, marginT=8), 
       fields={     
        @Field(name="titleText", mode="p", valueExpr="#{bean.mapID(wcx,'reportTitle')}", expectedType=String.class, 
         [email protected](type=StlType.print, align="center", bold=true, fontSize=16, marginT=20, paddingB=4, paddingL=4, paddingR=4, paddingT=4, textAlign="center", width="200")),    
        @Field(name="voucherNumberText", mode="p", valueExpr="#{bean.mapID(wcx,'VoucherNum')} : #{(?).id.num} #{bean.mapID(wcx,'VoucherOf')} #{util.format((?).onDate, 'dd/MM/yyyy')}", expectedType=String.class, 
         [email protected](type=StlType.print, align="center", fontSize=10, textAlign="center")),       
        @Field(name="id.sgSr", mode="", queryFilter=true), 
        @Field(name="id.num", width="60px", mode="v"), 
        @Field(name="reference"), 
        @Field(name="onDate", mode="v"),      
        @Field(name="fromSection"), 
        @Field(name="supplier") } 
       ), 
      @SubTab(name="ItemsTab", subView= 
       @SubView(name="StkEntranceVoucherItem", entityType=StkInputVoucherItem.class, editable=true, 
        listingFields={ 
         @Field(name="id.vcr", mode="", queryFilter=true), 
         @Field(name="id.item", width="60px", codeLabel=true), 
         @Field(name="id.item.label", width="150px", mode="rvp"), 
         @Field(name="quantity", width="60px"), 
         @Field(name="id.item.measureUnit", width="50px", mode="rpv"), 
         @Field(name="unitPrice", width="60px"), 
         @Field(name="amount", width="80px", mode="rvp", 
           calcExpr="#{(?).quantity*(?).unitPrice}"), 
         @Field(name="batch", jsfCpn=JsfCpn.button, linkedViewName="StkInputVoucherBatch", 
           styleClass="no_padding", width="24px"), 
         @Field(name="comment", width="100px") })), 
      @SubTab(name="StkEntranceVoucherTotalTab", [email protected](css="float:right;"), 
       fields={ 
        @Field(name="totalField", ofColFooter="amount", mode="rvp", 
         valueExpr="(?).amount", expectedType=Double.class, 
         calcExpr="#{(?)==bean.record?bean.sum(':amount'):(?).amount}") }) 
      }) 
    }) 

но не полностью тот же синтаксис, потому что здесь я использую массив @tab и массив @Field, но я не могу иметь множество различных аннотаций

+2

Вы не можете. Об этом сообщает сообщение об ошибке. –

+0

спасибо, но какой способ сохранить упорядоченный список в аннотации? –

+0

Как @JBNizet, вы не можете этого сделать. Однако, если вы объясните, чего вы хотите достичь, мы, вероятно, сможем помочь вам с другим решением. – AlexR

ответ

0

Я надеюсь, я получил твоя идея. Вы хотите добиться чего-то вроде:

@MyAnnotationContainer(
{@MyAnnotation1, @MyAnntation2, @MyAnntation3} 
) 
class MyClass {} 

Невозможно в java. Но вам это действительно не нужно. Вы можете поместить ваши аннотации непосредственно на классе:

@MyAnnotation1 
@MyAnnotation2 
@MyAnnotation3 
class MyClass {} 

Теперь вы можете получить заявленные аннотаций из вашего класса, так что вы на самом деле получить упорядоченный список, который вы хотите. Очевидно, что вы можете фильтровать только соответствующие аннотации и опускать другие (а не ваши) аннотации.

+0

Вы поняли необходимость, но решение не является адекватным, спасибо в любом случае –

+0

Решение должно быть иерархическим –

+0

Иерархия не может быть достигнута напрямую с аннотациями. Однако, опять же, это звучит как известная проблема xy. Попытайтесь объяснить, какова ваша основная задача. Вероятно, мы предложим вам лучшее решение. – AlexR

Смежные вопросы