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

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

    XMLWordPrintable

Details

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

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

      Attachments

        Issue Links

          Activity

            People

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

              Dates

                Created:
                Updated:
                Resolved: