2 Replies Latest reply on Jul 9, 2014 2:56 PM by lexsoto

    CDI Interceptor not invoked

    lexsoto

      Hello,

       

      I am testing a simple CDI interceptor with WildFly 8.0.0.Final  and it is not being invoked.

      I only have the following dependencies:

       

      <dependencies>
              <dependency>
                  <groupId>javax</groupId>
                  <artifactId>javaee-web-api</artifactId>
                  <version>6.0</version>
                  <scope>provided</scope>
              </dependency>
              <dependency>
                  <groupId>org.slf4j</groupId>
                  <artifactId>slf4j-api</artifactId>
                  <version>1.6.4</version>
              </dependency>
          </dependencies>
      
      

       

      My Annotation is:

       

      package org.interceptor.test;
      
      
      import static java.lang.annotation.ElementType.METHOD;
      import static java.lang.annotation.ElementType.TYPE;
      
      import java.lang.annotation.Inherited;
      import java.lang.annotation.Retention;
      import java.lang.annotation.RetentionPolicy;
      import java.lang.annotation.Target;
      
      import javax.interceptor.InterceptorBinding;
      
      @Inherited
      @InterceptorBinding
      @Retention(RetentionPolicy.RUNTIME)
      @Target({METHOD, TYPE})
      public @interface MethodLogger {
          String action();
      }
      
      
      

       

      The interceptor is this:

       

      package org.interceptor.test;
      
      
      import javax.interceptor.AroundInvoke;
      import javax.interceptor.Interceptor;
      import javax.interceptor.InvocationContext;
      
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      
      @MethodLogger(action = "")
      @Interceptor
      public class MethodInterceptor {
         
        private static Logger log = LoggerFactory.getLogger(MethodInterceptor.class);
      
          @AroundInvoke
          public Object aroundInvoke(InvocationContext invocation) throws Exception {
          log.info("**** BEFORE **** ");
        Object result = invocation.proceed();
          log.info("**** AFTER **** ");
          return result;
          }
      }
      
      

       

      The CDI bean subject of interception is:

       

      package org.interceptor.test;
      
      import javax.faces.application.FacesMessage;
      import javax.faces.context.FacesContext;
      import javax.inject.Named;
      
      @Named
      public class DatabaseManager {
      
          @MethodLogger(action = "Truncate Table")
          public String truncateTable() {
        FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Table has been truncated."));
              return "";
          }
         
      }
      
      

      My beans.xml file in the WEB-INF directory is this:

       

      <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
             http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
             version="1.1" bean-discovery-mode="all">
         <interceptors>
              <class>org.interceptor.test.MethodInterceptor</class>
          </interceptors>
      </beans>
      
      

      My JSF Page where the CDI bean method is invoked is here:

       

      <!DOCTYPE html>
      <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:h="http://java.sun.com/jsf/html">
      <head>
          <title>Sample Application</title>
      </head>
      <body>
          <h:form id="myForm">
          <h1>Demo Application</h1>
            <h:commandButton action="#{databaseManager.truncateTable}" value="Click to test method" />
            <h:messages/>
          </h:form>
      </body>
      </html>
      
      

       

      The databaseManager method is invoked but the interceptor is not.

      What am I doing wrong?

       

      TIA,

      Alex

        • 1. Re: CDI Interceptor not invoked
          lexsoto

          Interesting that if I remove the annotation "action" parameter it starts working.

          In my case, I need to have some parameters in the annotation, so the interceptor can use this information.

           

          Are parameterized annotations supported for CDI interceptors?

          • 2. Re: CDI Interceptor not invoked
            lexsoto

            Problem solved thanks to a colleague recommendation. 

            Needed to add the @Nonbining qualifier to the annotation property.

             

            @Inherited
            @InterceptorBinding
            @Retention(RetentionPolicy.RUNTIME)
            @Target({METHOD, TYPE})
            public @interface MethodLogger {
                @Nonbinding String action();
            }
            

             

            Without the @Nonbinding keyword, the interceptor is not activated.