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

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

    XMLWordPrintable

    Details

      Description

      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()
      }

        Gliffy Diagrams

          Attachments

            Issue Links

              Activity

                People

                • Assignee:
                  mmusgrov Michael Musgrove
                  Reporter:
                  dxmann73 David Mann
                • Votes:
                  0 Vote for this issue
                  Watchers:
                  6 Start watching this issue

                  Dates

                  • Created:
                    Updated:
                    Resolved: