@ -20,6 +20,8 @@ import java.lang.reflect.Method;
@@ -20,6 +20,8 @@ import java.lang.reflect.Method;
import org.springframework.context.ApplicationListener ;
import org.springframework.core.annotation.AnnotatedElementUtils ;
import org.springframework.transaction.event.TransactionPhase ;
import org.springframework.transaction.event.TransactionalApplicationListenerMethodAdapter ;
import org.springframework.transaction.event.TransactionalEventListenerFactory ;
/ * *
@ -37,20 +39,22 @@ public class RestrictedTransactionalEventListenerFactory extends TransactionalEv
@@ -37,20 +39,22 @@ public class RestrictedTransactionalEventListenerFactory extends TransactionalEv
@Override
public ApplicationListener < ? > createApplicationListener ( String beanName , Class < ? > type , Method method ) {
Transactional txAnn = AnnotatedElementUtils . findMergedAnnotation ( method , Transactional . class ) ;
if ( txAnn = = null ) {
txAnn = AnnotatedElementUtils . findMergedAnnotation ( type , Transactional . class ) ;
}
if ( txAnn ! = null ) {
Propagation propagation = txAnn . propagation ( ) ;
if ( propagation ! = Propagation . REQUIRES_NEW & & propagation ! = Propagation . NOT_SUPPORTED ) {
throw new IllegalStateException ( "@TransactionalEventListener method must not be annotated with " +
"@Transactional unless when declared as REQUIRES_NEW or NOT_SUPPORTED: " + method ) ;
TransactionalApplicationListenerMethodAdapter adapter =
new TransactionalApplicationListenerMethodAdapter ( beanName , type , method ) ;
if ( adapter . getTransactionPhase ( ) ! = TransactionPhase . BEFORE_COMMIT ) {
Transactional txAnn = AnnotatedElementUtils . findMergedAnnotation ( method , Transactional . class ) ;
if ( txAnn = = null ) {
txAnn = AnnotatedElementUtils . findMergedAnnotation ( type , Transactional . class ) ;
}
if ( txAnn ! = null ) {
Propagation propagation = txAnn . propagation ( ) ;
if ( propagation ! = Propagation . REQUIRES_NEW & & propagation ! = Propagation . NOT_SUPPORTED ) {
throw new IllegalStateException ( "@TransactionalEventListener method must not be annotated with " +
"@Transactional unless when declared as REQUIRES_NEW or NOT_SUPPORTED: " + method ) ;
}
}
}
return super . createApplicationListener ( beanName , type , method ) ;
return adapter ;
}
}