2012-11-15 5 views
19

Un anno circa ho letto un articolo che spiegava come creare un'annotazione che fondamentalmente è un contenitore per altre annotazioni. In questo modo, se uso sempre le stesse 5 annotazioni in un caso d'uso specifico, creo un'annotazione che le contiene e la uso invece.Come creare un'annotazione che è un gruppo di annotazioni?

Purtroppo, non riesco più a trovare l'articolo e mi piacerebbe davvero farlo ora per la mia configurazione di jackson.

Dal momento che non riesco a trovare alcuna informazione al riguardo, sto cominciando a mettere in discussione la mia memoria. È possibile o mi sbaglio?

EDIT

Quello che voglio è qualcosa di simile:

@Target(ElementType.METHOD) 
@com.fasterxml.jackson.databind.annotation.JsonSerialize(using=MySerializerThatIsUsedEverywhere.class 
@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(MyCustomXmlAdapter.class) 
@SomeOtherEvaluatedByTheSerializer 
public @interface SerializerUseCase01 { 
    public String a(); 
    public int b(); 
) 

mio scenario è che ho un sacco di casi d'uso serializzazione che possono essere gestiti dallo stesso serializzatore con differenti configurazioni. Per rendere tutto più facile da usare e più trasparente voglio avvolgere la configurazione di Jackson e la configurazione di serializzazione in un'unica annotazione.

risposta

15

Per Jackson, questo può essere fatto con @JacksonAnnotationsInside meta-annotazione. Vedere this article di più, ma frammento di codice da lì è:

@Retention(RetentionPolicy.RUNTIME) // IMPORTANT 
@JacksonAnnotationsInside 
@JsonInclude(Include.NON_NULL) 
@JsonPropertyOrder({ "id", "name" }) 
public @interface MyStdAnnotations 

e da essa è possibile utilizzare questo tipo per le proprie classi in questo modo:

@MyStdAnnotations 
public class MyBean { 
    public String name, id; 
} 
2

Ci sono alcuni esempi here su come creare varie combinazioni di annotazioni contenenti altre annotazioni. E 'questo quello che stai cercando?

Esempio dalla fonte:

@Target(ElementType.METHOD) 
public @interface SimpleAnnotation { 
    public String a(); 
    public int b(); 
) 

@Target(ElementType.METHOD) 
public @interface ReallyComplexAnnotation { 
    public SimpleAnnotation[] value(); 
) 

Utilizzato in questo modo:

@ReallyComplexAnnotation(
    { @SimpleAnnotation(a="...", b=3), @SimpleAnnotation(a="...", b=4) } 
) 
+0

spero la mia modifica ha reso tutto un po 'di più chiaro – Laures

+0

Hmm. Quindi vuoi che 'SerializerUseCase01' sia qualcosa di simile ad un alias per una serie di altre interfacce (nascoste come dettagli di implementazione), è corretto? – Thor84no

+0

corretto. Ma non ne sono più sicuro, perché nessuna delle annotazioni che voglio "nascondere" è contrassegnata da "@Target ({ElementType.ANNOTATION_TYPE, ...}". – Laures

Problemi correlati