Come scrivere una nuova annotazione che si comporta esattamente come una esistente?

1

Ecco il mio caso d'uso. Supponiamo che le annotazioni abbiano abbiano ereditarietà e automaticamente erediteranno l'intero comportamento della classe base. Quindi farei quanto segue (nota le due istruzioni del pacchetto):

package cdiswitcher.precdi;
public @interface SessionScoped extends javax.faces.bean.SessionScoped {}
public @interface ManagedBean extends javax.faces.ManagedBean {}

package cdiswitcher.cdi;
public @interface SessionScoped extends javax.enterprise.context.SessionScoped {}
public @interface ManagedBean extends javax.inject.Named {}

Lo stesso per varie altre coppie di annotazioni come @ejb e @inject . Ciò semplificherebbe il passaggio tra i due sistemi di iniezione di bean: basta sostituire ogni istanza di cdiswitcher.precdi da cdiswitcher.cdi o viceversa.

Un altro caso d'uso potrebbe estendere il comportamento di un'annotazione, forse anche la creazione di una singola nuova annotazione che abbia lo stesso effetto di due esistenti.

    
posta Hans Adler 09.02.2015 - 16:50
fonte

2 risposte

1

L'ereditarietà è non consentita con annotazioni . Tuttavia, c'è un modo per fare ciò che stai cercando di fare, ma potrebbe valere la pena o meno.

Potresti scrivere uno script di build che esegue sostituzioni regex sul tuo codice sorgente prima di compilarlo. Questo potrebbe cambiare i nomi delle annotazioni e importare i pacchetti dinamicamente. Suggerisco di non importare pacchetti se lo fai, quindi devi solo sostituire il testo in una posizione in ogni file. Meno sostituzione di testo magico che esegui, meglio è

Questa non è una buona soluzione, ma è una soluzione valida. In generale, il codice sorgente deve essere creato manualmente o generato dinamicamente, non una combinazione bizzarra dei due. Personalmente, proverei a cambiare i requisiti. Potrebbe essere più sano.

    
risposta data 09.02.2015 - 21:08
fonte
0

Per il tuo particolare problema, puoi scrivere un'estensione CDI per trovare i bean con l'annotazione personalizzata (o l'annotazione di base che stai trovando e sostituendo) e usarla per modificare le definizioni dei bean nella distribuzione. Ad esempio, la libreria CODI (come ricordo) lo fa per riutilizzare @javax.faces.bean.ViewScoped per il proprio ambito di visualizzazione personalizzato.

Con questa estensione teorica puoi scrivere classi usando le annotazioni JSF 2 ed eseguirle in un progetto CDI senza modificare il codice.

Il passaggio tra @EJB e @Inject non è così semplice come funzionano in modo diverso in qualche modo e non funzionano come sostituti diretti l'uno dell'altro.

Se possibile, sarebbe molto più semplice scrivere le classi condivise come semplici POJO, quindi scrivere un wrapper CDI e un wrapper JSF come JAR separati, quindi l'implementazione non è legata a nessun contenitore in particolare.

    
risposta data 12.03.2015 - 03:43
fonte

Leggi altre domande sui tag