2013-06-11 11 views
5

Sto lavorando all'implementazione di vari servizi REST, utilizzando Spring MVC. Per la documentazione, sto usando Swagger.Combina più annotazioni in una per evitare di ripeterle

Questo funziona bene e la documentazione sembra buona ed è davvero funzionale. L'unico problema che ho è che le annotazioni per la documentazione affollano davvero le classi del controllore, specialmente le annotazioni del codice di errore.

Esempio:

@ApiErrors(value = { 
    @ApiError(code = 123, reason = "Reason123"), 
    @ApiError(code = 124, reason = "Reason124"), 
    @ApiError(code = 125, reason = "Reason125"), 
    @ApiError(code = 126, reason = "Reason126"), 
    @ApiError(code = 127, reason = "Reason127") }) 
public void exampleFunctionImplementation() { 
} 

In molti casi, questo porta a grandi blocchi di annotazioni in cui il codice vero e proprio applicazione è nascosto da qualche parte nel mezzo. Inoltre, questi set di annotazioni vengono spesso ripetuti, poiché molti metodi potrebbero restituire lo stesso insieme di codici di errore.

C'è qualche opzione per accorciare un po questo attraverso la definizione dell'elenco di annotazioni da qualche altra parte come costante in un altro file di classe? O forse qualcosa di ancora più semplice che potrei aver trascurato?

ho provato con la definizione del campo di @ApiError elementi da qualche parte, ma questo non si compila:

ApiError[] array = {ApiError(code = 123, reason = "Reason123")}; 

Sarei felice se qualcuno mi potrebbe dare un suggerimento come risolvere questo problema, grazie in anticipo!

+0

Entrambi avete lo stesso problema: http://stackoverflow.com/questions/14195155/ibatis-create-an-array-of-multiple-annotations-annotation-reuse – Anderson

risposta

1

I membri di annotazione hanno solo tipi limitati (JLS 9.6).

Si tratta di un errore di compilazione se il tipo di ritorno di un metodo dichiarato in un tipo di annotazione non è uno dei seguenti: un tipo primitivo, String, Class, nessuna invocazione parametrizzato di classe, un tipo enum (§8.9), un tipo di annotazione o un tipo di array (§10) il cui tipo di elemento è uno dei tipi precedenti.

I loro valori devono essere espressioni costanti (JLS 9.7). Lo standard utilizza il termine commisurato.

T è un tipo di matrice E [] e:

V è un ElementValueArrayInitializer ed ogni elementValue (analogo a un VariableInitializer in un inizializzatore array) in V è commisurato con E; o

V è un elementValue commisurata E.

Il tipo di V è compatibile assegnazione (§5.2) con T, e inoltre:

Se T è un tipo primitivo o stringa, e V è un'espressione costante (§15.28).

V non è nullo.

Se T è Classe o un'invocazione di Classe e V è un valore letterale di classe (§15.8.2).

Se T è un tipo enum e V è una costante enum.

L'array non è un'espressione costante, quindi il codice non verrà compilato. Se prevedi di avere elenchi di annotazioni di grandi dimensioni, forse c'è un altro modo per svolgere questa attività.Non conosco Swagger, quindi potresti non essere in grado di evitarlo.

+1

Che peccato - in qualche modo, speravo lì sarebbe un modo intelligente per riutilizzare in qualche modo un insieme di annotazioni :-( – Volker

+0

Java 8 aiuterà. Vedi http://docs.oracle.com/javase/tutorial/java/annotations/repeating.html –

+1

@EricJablow, questo la nuova funzionalità è piacevole ma non sarà d'aiuto, perché topic starter non vuole duplicare le annotazioni tra i metodi: vuole piuttosto definire l'ingombrante annotazione una volta e applicarla ad altri metodi, ho lo stesso problema con Swagger. – walv

Problemi correlati