SeamFramework.orgCommunity Documentation

Capitolo 31. Annotazioni di Seam

31.1. Annotazioni per la definizione di un componente
31.2. Annotazioni per la bijection
31.3. Annotazioni per i metodi del ciclo di vita dei componenti
31.4. Annotazioni per la demarcazione del contesto
31.5. Annotazioni per l'uso con i componenti JavaBean di Seam in ambiente J2EE
31.6. Annotazioni per le eccezioni
31.7. Annotazioni per Seam Remoting
31.8. Annotazioni per gli interceptor di Seam
31.9. Annotazioni per l'asincronicità
31.10. Annotazioni per l'uso di JSF
31.10.1. Annotazioni per l'uso con dataTable
31.11. Meta-annotationi per il databinding
31.12. Annotazioni per i pacchetti
31.13. Annotazioni per l'integrazione con un servlet container

Quando si scrive un'applicazione Seam vengono impiegate molte annotazioni. Seam ti consente di usare annotazioni per ottenere uno stile dichiarativo di programmazione. La maggior parte delle annotazioni che si useranno sono definite dalla specifica EJB3.0. Le annotazioni per la validazione dei dati sono definite dal pacchetto Hibernate Validator. Infine Seam definisce un suo set di annotazioni che verranno descritte in questo capitolo.

Tutte queste annotazioni sono definite nel pacchetto org.jboss.seam.annotations.

Il primo gruppo di annotazioni consente di definire un componente Seam. Queste annotazioni appaiono sulla classe del componente.

@Name
@Name("componentName")

Definisce il nome del componente Seam per una classe. Quest'annotazione è richiesta per tutti i componenti Seam.

@Scope
@Scope(ScopeType.CONVERSATION)

Definisce il contesto di default del componente. I possibili valori sono definiti dalla enumeration ScopeType: EVENT, PAGE, CONVERSATION, SESSION, BUSINESS_PROCESS, APPLICATION, STATELESS.

Quando non viene specificato nessuno scope, quello di default dipende dal tipo di componente. Per session bean stateless, il default è STATELESS. Per gli entity bean ed i session bean stateful, il default è CONVERSATION. Per i JavaBean, il default è EVENT.

@Role
@Role(name="roleName", scope=ScopeType.SESSION)

Consente ad un componente Seam di venir associato a variabili di contesto multiple. Le annotazioni @Name/@Scope definiscono un "ruolo di default". Ciascuna annotazione @Role definisce un ruolo addizionale.

@Roles
@Roles({

        @Role(name="user", scope=ScopeType.CONVERSATION),
        @Role(name="currentUser", scope=ScopeType.SESSION)
   })

Consente la specificazione di ruoli multipli addizionali.

@BypassInterceptors
@BypassInterceptors

Disabilita tutti gli interceptor di Seam per un particolare componente o metodo di un componente.

@JndiName
@JndiName("my/jndi/name")

Specifica il nome JNDI che Seam userà per la ricerca del componente EJB. Se non è stato specificato esplicitamente alcun nome, Seam userà il pattern JNDI specificato da org.jboss.seam.core.init.jndiPattern.

@Conversational
@Conversational

Specifica che il componente con scope conversazione è conversazionale, il che significa che nessun metodo del componente potrà essere chiamato amenoché sia attiva una conversazione long-running.

@PerNestedConversation
@PerNestedConversation

Limita lo scope di un componente con scope conversazione alla sola conversazione padre in cui è stato istanziato. L'istanza del componente non sarà visibile alle conversazioni figlie innestate, che otterranno la propria istanza.

Attenzione: questo è mal definito, poiché implica che un componente sarà visibile per alcune parti del ciclo di richiesta, ed invisibile dopo questo. Non è raccomandato che un'applicazioni usi questa caratteristica!

@Startup
@Scope(APPLICATION) @Startup(depends="org.jboss.seam.bpm.jbpm")

Specifica che un componente con scope applicazione venga avviato immediatamente in fase di inizializzazione. E' usato principalmente per certi componenti predefiniti che avviano un'infrastruttura critica, quali JNDI, datasource, ecc.

@Scope(SESSION) @Startup

Specifica che un componente con scope di sessione viene avviato immediatamente alla creazione della sessione.

@Install
@Install(false)

Specifica se oppure no, un componente debba essere installato di default. La mancanza dell'annotazione @Install indica che un componente viene installato.

@Install(dependencies="org.jboss.seam.bpm.jbpm")

Specifica che un componente debba essere installato solo se i componenti elencati come dipendenze sono pure installati.

@Install(genericDependencies=ManagedQueueSender.class)

Specifica che un componente debba essere installato solo se un componente che è implementato da una certa classe è installato. Questo è utile quando la dipendenza non ha un singolo nome ben noto.

@Install(classDependencies="org.hibernate.Session")

Specifica che un componente debba essere installato solo se la classe (con nome) è nel classpath.

@Install(precedence=BUILT_IN)

Specifica la precedenza del componente. Se esistono più componenti con lo stesso nome, verrà installato quello con precedenza più alta. I valori definiti di precedenza sono (in ordine ascendente):

@Synchronized
@Synchronized(timeout=1000)

Specifica che un componente venga acceduto in modo concorrente da più client, e che Seam serializzi le richieste. Se una richiesta non è in grado di ottenere il lock sul componente in un determinato periodo di timeout, viene sollevata un'eccezione.

@ReadOnly
@ReadOnly

Specifica che un componente JavaBean o metodo di componente non richieda la replicazione dello stato alla fine dell'invocazione.

@AutoCreate
@AutoCreate

Specifica che un componente verrà automaticamente creato, anche se il client non specifica create=true.

Le prossime due annotazioni controllano la bijection. Questi attributi vengono impiegati nelle variabili d'istanza di un componente o nei metodi di accesso alle proprietà.

@In
@In

Specifica che un attributo di componente debba essere iniettato da una variabile di contesto all'inizio di ogni invocazione del componente. Se la variabile di contesto è null, viene lanciata un'eccezione.

@In(required=false)

Specifica che un attributo di componente debba essere iniettato da una variabile di contesto all'inizio di ogni invocazione del componente. La variabile di contesto può essere null.

@In(create=true)

Specifica che un attributo di componente debba essere iniettato da una variabile di contesto all'inizio di ogni invocazione del componente. Se la variabile di contesto è null, viene istanziata da Seam un'istanza del componente.

@In(value="contextVariableName")

Specifica il nome della variabile di contesto in modo esplicito, invece di usare il nome annotato della variabile d'istanza.

@In(value="#{customer.addresses['shipping']}")

Specifica che un attributo di componente debba essere iniettato valutando un'espressione JSF EL all'inizio di ogni invocazione del componente.

@Out
@Out

Specifica che un attributo di componente (di Seam) venga messo in outjection nella sua variabile di contesto alla fine dell'invocazione. Se l'attributo è null, viene lanciata un'eccezione.

@Out(required=false)

Specifica che un attributo di componente (di Seam) venga messo in outjection nella sua variabile di contesto alla fine dell'invocazione. L'attributo può essere null.

@Out(scope=ScopeType.SESSION)

Specifica che un attributo di componente che non è un tipo di componente di Seam venga messo in outjection in uno specifico scope alla fine dell'invocazione.

In alternativa, se non è specificato alcuno scope in modo esplicito, viene usato lo scope del componente con l'attributo @Out (o lo scope EVENT se il componente è stateless).

@Out(value="contextVariableName")

Specifica il nome della variabile di contesto in modo esplicito, invece di usare il nome annotato della variabile d'istanza.

Si noti che è piuttosto comune l'uso di queste annotazioni assieme, per esempio:

@In(create=true) @Out private User currentUser;

La prossima annotazione supporta il pattern manager component, dove un componente Seam che gestisce il ciclo di vita di un'istanza di qualche altra classe deve essere iniettata. Appare sul metodo getter del componente.

La prossima annotazione supporta il pattern factory component dove un componente Seam è responsabile dell'inizializzazione del valore di una variabile di contesto. Questo è utile in particolare per inizializzare qualsiasi stato occorrente per il rendering della risposta in una richiesta non-faces. Appare su un metodo di componente.

Questa annotazione consente di iniettare un Log:

L'ultima annotazione consente di iniettare un valore di un parametro di richiesta:

Queste annotazioni consentono al componente di reagire agli eventi del proprio ciclo di vita. Accadono sul metodo del componente. Possono essere solo una per ogni classe di componente.

Queste annotazioni forniscono una demarcazione dichiarativa della conversazione. Appaiono sui metodi dei componenti Seam, solitamente metodi action listener.

Ogni richiesta web ha un contesto di conversazione associato ad essa. La maggior parte di queste conversazioni finisce alla fine della richesta. Se si vuole che una conversazione si espanda lungo richieste multiple, si deve "promuovere" la conversazione corrente a conversazione long-running chiamando un metodo marcato con @Begin.

@Begin
@Begin

Specifica che la conversazione long-running inizia quando questo metodo restuisce un esito non-null senza eccezioni.

@Begin(join=true)

Specifica che se una conversazione long-running è già in esecuzione, il contesto della conversazione viene semplicemente propagato.

@Begin(nested=true)

Specifica che se una conversazione ong-running è già in esecuzione, inizia un nuovo contesto di conversazione innestata. La conversazione innestata terminerà quando viene incontrato il successivo @End, e verrà ripristinata la conversazione più esterna. E' perfettamente legale che esistano conversazioni innestate concorrenti nella stessa conversazione più esterna.

@Begin(pageflow="process definition name")

Specifica il nome della definizione di processo jBPM che definisce il pageflow per questa conversazione.

@Begin(flushMode=FlushModeType.MANUAL)

Specifica la modalità di flush di un qualsiasi contesto di persistenza gestito da Seam. flushMode=FlushModeType.MANUAL supporta l'uso di conversazioni atomiche dove tutte le operazioni di scrittura vengono accodate nel contesto di conversazione fino ad una chiamata esplicita al metodo flush() (che solitamente avviene alla fine della conversazione).

  • join — determina il comportamento quando una conversazione long-running è già attiva. Se true, il contesto viene propagato. Se false, viene lanciata un'eccezione. Di default è false. Quest'impostazione è ignorata quando è specificato nested=true.

  • nested — specifica che una conversazione innestata sia avviata se è già presente una conversazione long-running.

  • flushMode — imposta la modalità flush di ogni sessione Hibernate gestita da Seam o contesto di persistenza JPA che vengono creati durante la conversazione.

  • pageflow — un nome di definizione di processo jBPM deployato via org.jboss.seam.bpm.jbpm.pageflowDefinitions.

@End
@End

Specifica che una conversazione long-running termina quando questo metodo restituisce un esito non-null senza eccezioni.

@StartTask
@StartTask

"Inizia" un task jBPM. Specifica che una conversazione long-running inizi quando questo metodo restituisce un esito non-null senza eccezione. Questa conversazione è associata ad un task jBPM specificato nel parametro della richiesta. Dentro il contesto di questa conversazione è definito anche il contesto del processo di business per l'istanza del processo di business dell'istanza task.

@BeginTask
@BeginTask

Ripristina il lavoro su un task jBPM incompleto. Specifica che la conversazione long-running inizi quando questo metoto restituisce un esito non-null senza eccezioni. Questa conversazione è associata al task jBPM specificata nel parametro di richiesta. Dentro il contesto di questa conversazione, è definito anche un contesto di business process per l'istanza del processo di business dell'istanza task.

@EndTask
@EndTask

"Termina" un task jBPM. Specifica che una conversazione long-running termina quando il metodo ritorna un esito non-null, e che il task corrente è completo. Lancia una transizione jBPM. La transizione lanciata sarà la transizione di default amenoché l'applicazione chiami Transition.setName() sul componente predefinito chiamato transition.

@EndTask(transition="transitionName")

Lancia la transizione jBPM data.

@CreateProcess
@CreateProcess(definition="process definition name")

Crea una nuova istanza di processo jBPM quando il metodo restituisce un esito non-null senza eccezione. L'oggetto ProcessInstance sarà disponibile in una variabile di contesto chiamata processInstance.

@ResumeProcess
@ResumeProcess(processIdParameter="processId")

Reinserisce lo scope di un'istanza esistente di processo jBPM quando il metodo ritorna un esisto non-null senza eccezione. L'oggetto ProcessInstance sarà disponibile in una variabile di contesto chiamata processInstance.

@Transition
@Transition("cancel")

Marca un metodo come segnalante una transizione nell'istanza del processo jBPM corrente quando il metodo restituisce un risultato non-null.

Seam fornisce un'annotazione che consente di forza un rollback di una transazione JTA per certi esiti action listener.

Queste annotazioni sono utili per i componenti Seam JavaBean. Se si usano i componenti EJB 3.0, occorre usare l'annotazione standard Java EE 5.

Queste annotazioni consentono di specificare come Seam debba gestire un'eccezione che si propaga fuori da un componente Seam.

Seam Remoting richiede che l'interfaccia locale di un session bean sia annotato con la seguente annotazione:

Nelle classi interceptor di Seam appaiono le seguenti annotazioni.

Si prega di fare riferimento alla documentazione della specifica EJB 3.0 per informazioni sulle annotazioni richieste per la definizione di interceptor EJB.

Le seguenti annotazioni vengono usate per dichiarare un metodo asincrono, per esempio:

@Asynchronous public void scheduleAlert(Alert alert, @Expiration Date date) { ... }
@Asynchronous public Timer scheduleAlerts(Alert alert, 

   @Expiration Date date, 
   @IntervalDuration long interval) { ... }

Queste annotazioni rendono più facile lavorare con JSF.

Le seguenti annotazioni facilitano l'implementazione di liste cliccabili con dietro un bean di sessione stateful. Appaiono sugli attributi.

@DataModel
@DataModel("variableName")

Fa l'outjection di una proprietà di tipo List, Map, Set o Object[] come un DataModel JSF nello scope del componente proprietario (o nello scope EVENT se il componente proprietario è STATELESS). In caso di Map, ogni riga di DataModel è una Map.Entry.

@DataModelSelection
@DataModelSelection

Inietta il valore selezionato dal DataModel JSF (questo è l'elemento della collezione sottostante, o valore di mappa). Se è definito solo un attributo @DataModel per un componente, verrà iniettato il valore selezionato da quel DataModel. Altrimenti, il nome del componente di ciascun DataModel dovrà essere specificato nell'attributo di valore per ogni @DataModelSelection.

Se sul @DataModel associato è specificato lo scope PAGE, allora in aggiunta alla DataModel Selection iniettata, verrà iniettato anche il DataModel associato. In questo caso, se la proprietà annotata con @DataModel è un metodo getter, allora il metodo setter per la proprietà deve essere parte della Business API del componente Seam che lo contiene.

@DataModelSelectionIndex
@DataModelSelectionIndex

Espone l'indice della selezione del DataModel JSF come un attributo del componente (questo è il numero riga della collezione sottostante, o la chiave della mappa). Se per un componente è definito solo un attributo @DataModel, verrà iniettato il valore selezionato da quel DataModel. Altrimenti il nome del componente di ciascun @DataModel deve essere specificato nell'attributo valore per ogni @DataModelSelectionIndex.

Queste meta-annotazioni rendono possibile implementare una funzionalità simile in @DataModel e @DataModelSelection per altre strutture di dati oltre alla lista.

Questa annotazione fornisce un meccaniscmo per dichiarare informazioni riguardanti un set di componente impacchettati assieme. Può essere applicata a qualsiasi pacchetto Java.

Queste annotazioni consentono di integrare i componenti Seam con un servlet container.