2010-08-31 22 views
6

Devo utilizzare 3 diversi gestori di transazioni nella mia webapp. Così ho scritto la mia annotazione secondo lo Spring reference (Sezione 10.5.6.3 annotazioni di collegamento personalizzate).HowTo estendere Spring Annotation @Transactional

Un'annotazione (per l'utilizzo di uno specifico TransactionManager) si presenta così:

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

import org.springframework.transaction.annotation.Transactional; 

@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Transactional("customer") 
public @interface CustomerTX{ 


} 

Tutto sta funzionando benissimo quando l'annotazione il mio livello di servizio con l'annotazione @CustomerTX personalizzato. Ma devo fornire più opzioni per la mia annotazione, come readonly = true, rollbackFor = e così via. Poiché non è possibile "estendere" un'annotazione (ho davvero bisogno di estendere l'annotazione @Transactional da Spring), qual è l'implementazione corretta per questo?

risposta

3

Dovrai creare diverse annotazioni personalizzate, ho paura, una per ogni caso d'uso, annotandole ognuna con l'esatta annotazione @Transactional di cui hai bisogno.

Oppure dovrai scrivere il tuo aspetto in AspectJ (estendi org.springframework.transaction.aspectj.AbstractTransactionAspect da spring-aspects.jar) per creare la tua logica di transazione.

+0

Pensi davvero dire che devo scrivere qualcosa del genere (assumendo voglio solo hanno fissato la transazione in sola lettura): @Target ({ElementType.METHOD, ElementType.TYPE}) @Retention (RetentionPolicy.RUNTIME) @Transactional (value = "cliente", readOnly = true) @interface pubblico CustomerTXReadonly { } Questo non può essere l'unica soluzione di lavoro ... –

+0

Temo di sì, perché dei limiti delle annotazioni. Come ho detto: o quello o scrivendo i tuoi aspetti (che preferirei) –

+0

Grazie per il tuo aiuto. Proverò a scrivere i miei aspetti personali. È un peccato che le annotazioni non siano estendibili :( –

0

Nella primavera 4 puoi farlo. Come indicato nello documentation

Le metriche possono anche essere combinate per creare annotazioni composte. Ad esempio, l'annotazione @RestController di Spring MVC è composta da @Controller e @ResponseBody.

Inoltre, le annotazioni composte possono facoltativamente ridichiarare gli attributi dalle meta-annotazioni per consentire la personalizzazione dell'utente. Questo può essere particolarmente utile quando vuoi esporre solo un sottoinsieme degli attributi della meta-annotazione. Ad esempio, l'annotazione Spring's @SessionScope codifica il nome dell'ambito in sessione, ma consente comunque la personalizzazione del proxyMode.

@Target({ElementType.TYPE, ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Scope(WebApplicationContext.SCOPE_SESSION) 
public @interface SessionScope { 

    /** 
    * Alias for {@link Scope#proxyMode}. 
    * <p>Defaults to {@link ScopedProxyMode#TARGET_CLASS}. 
    */ 
    @AliasFor(annotation = Scope.class) 
    ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS; 

} 
Problemi correlati