Uploaded image for project: 'WildFly'
  1. WildFly
  2. WFLY-2485

@Transactional not working correctly with @Stereotype wrt. Exception handling

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Minor Minor
    • 8.0.0.Final
    • 8.0.0.Beta1
    • Transactions
    • None

      Hi,

      suppose I have a @Stereotype with a @Transactional annotation:

      @Named
      @ViewScoped
      @Transactional
      @Stereotype
      @Retention (RetentionPolicy.RUNTIME)
      @Target (ElementType.TYPE)
      public @interface Boundary
      { }

      I annotate a CDI Bean with this stereotype

      @Boundary
      public class BusinessLogic {
      public void doSomething()

      { throw new RuntimeException("foo"); }

      }

      If any exceptions are thrown when calling the business method, the user will get the (incorrect) info that the Class is missing a @Transactional annotation, because the Interceptor doesn't bother to look further into the Stereotype (see below).

      What's worse, the interceptor is swallowing the real exeption in the process. We get the following Stacktrace:

      java.lang.RuntimeException: ARJUNA016107: Expected an @Transactional annotation at class and/or method level
      at com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorBase.getTransactional(TransactionalInterceptorBase.java:61)
      at com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorBase.handleException(TransactionalInterceptorBase.java:96)
      at com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorBase.invokeInOurTx(TransactionalInterceptorBase.java:72)

      Which is pretty clear from the implementation of TransactionalInterceptorBase:

      private Transactional getTransactional(InvocationContext ic) {

      Transactional transactional = ic.getMethod().getAnnotation(Transactional.class);
      if (transactional != null)

      { return transactional; }

      Class<?> targetClass = ic.getTarget().getClass();
      transactional = targetClass.getAnnotation(Transactional.class); // needs to look further
      if (transactional != null) { return transactional; }

      throw new RuntimeException(jtaLogger.i18NLogger.get_expected_transactional_annotation()); // swallows the exception that occured at ic.proceed()
      }

              rhn-engineering-mmusgrov Michael Musgrove
              dxmann73@gmail.com David Mann (Inactive)
              Votes:
              0 Vote for this issue
              Watchers:
              6 Start watching this issue

                Created:
                Updated:
                Resolved: