11 Replies Latest reply on Nov 30, 2012 8:02 AM by Andreas G

    Usage of a lifecycle Interceptor produces a WARN message in AS7

    Andreas G Newbie

      Hello,

       

      as described a.o. in http://docs.oracle.com/javaee/6/api/javax/interceptor/package-summary.html , we use a lifecycle interceptor like:

       

      public class LifecycleInterceptor {

          @PostConstruct

          private void postConstructInterceptor(InvocationContext ctx) {

              try {

                  ctx.proceed();

              } catch (Throwable e) {

                  // do sth.

              }

          }

      }

       

      and

       

      @Singleton

      @Interceptors({LifecycleInterceptor.class})

      public class MyEJB {

         @PostConstruct

         private void init() {

                 // do sth.

         }

       

         // ... other methods

      }

       

       

      On Startup (while deploying) JBoss AS7.1 shows a.o. the following messsage:

      WARN [org.jboss.interceptor.reader.InterceptorMetadataUtils] (MSC service thread 1-4) Method postConstruct defined on class LifecycleInterceptor will not be used for interception, since it is not defined according to the specification. It is annotated with @javax.annotation.PostConstruct, but is defined on the target class and does not have 0 arguments

       

      Everything works fine, i.e. in contrast to the message, the Interceptor is used for interception: the MyEJB.init() is called by LifecycleInterceptor.postConstructInterceptor(...) 

      My question is why this message occurs and how to solve the respective problem that produces it (if there is any).

        • 1. Re: Usage of a lifecycle Interceptor produces a WARN message in AS7
          xiang yingbing Master

          Who tell you that you can use @PostConstruct on interceptor's method???

          This annotation is ONLY for EJB.

           

          I think you should use  @AroundInvoke instead.

           

           

           

           

           

          My interceptor:

           

          @TransactionManagement(TransactionManagementType.CONTAINER)

          public class SessionTokenInterceptor {

              Logger log = Logger.getLogger(SessionTokenInterceptor.class);

             

              @PersistenceContext

              protected EntityManager em;

             

              @Resource

              private EJBContext ejbContext;

             

              @AroundInvoke

              public Object processSessionToken(final InvocationContext invocationContext) throws Exception{

                  //1. session token

                  ...

                 

                  //2. JAAS username

                  ...

                 

                  //3. check

                  ...

                 

                  //4. call original method and return its result so that other interceptor can continue

                  try{

                       return invocationContext.proceed();

                  }finally{

                  }

              }

          • 2. Re: Usage of a lifecycle Interceptor produces a WARN message in AS7
            Andreas G Newbie

            Hi,

             

            thank you for your reply.

            My goal is to intercept the @PostConstruct methods in other Classes (in my example the class MyEJB), i.e. I am not interested in intercepting any other methods, only @PostConstruct methods.

            As far as I know this is called Lifecycle Interceptor and it is defined/used as in my example, I hope - (see e.g. bottom of http://docs.oracle.com/javaee/6/api/javax/interceptor/package-summary.html ).

             

            And as I said, the code works, the only problem is the warning, which confuses me - so why does it occur and how to (appropriately) get rid of it?

            • 3. Re: Usage of a lifecycle Interceptor produces a WARN message in AS7
              xiang yingbing Master

              How about bellow codes?

               

               

               

               

               

              public class LifecycleInterceptor {

                  @AroundInvoke

                  private void postConstructInterceptor(InvocationContext ctx) {

                      try {

                          ctx.proceed();

                      } catch (Throwable e) {

                          // do sth.

                      }

                  }

              }

               

               

               

              and

               

               

               

              @Singleton

              public class MyEJB {

               

                 @Interceptors({LifecycleInterceptor.class})

                 @PostConstruct

                 private void init() {

                         // do sth.

                 }

               

                 // ... other methods

              }

              • 4. Re: Usage of a lifecycle Interceptor produces a WARN message in AS7
                xiang yingbing Master

                (see e.g. bottom of http://docs.oracle.com/javaee/6/api/javax/interceptor/package-summary.html ).

                Maybe you are right.

                 

                 

                Maybe jboss 7 does NOT support it well?

                Maybe I am wrong.

                • 5. Re: Usage of a lifecycle Interceptor produces a WARN message in AS7
                  xiang yingbing Master

                  I use those annotations according to the book "Enterprise.JavaBeans.3.1_6th.Edition".

                  They always works well in jboss because the author had tested related examples with JBoss: the package name is org.jboss.ejb3.examples.ch07...

                  • 7. Re: Usage of a lifecycle Interceptor produces a WARN message in AS7
                    jaikiran pai Master

                    WARN [org.jboss.interceptor.reader.InterceptorMetadataUtils]

                    That WARN is coming from a Weld class, which is strange. Do you have CDI components in your application?

                    • 8. Re: Usage of a lifecycle Interceptor produces a WARN message in AS7
                      Nicklas Karlsson Master

                      It appears to be coming from CDI, yes:

                      public static boolean isInterceptorMethod(InterceptionType interceptionType, MethodMetadata method, boolean forTargetClass)
                         {
                      
                            if (!method.getSupportedInterceptionTypes().contains(interceptionType))
                            {
                               return false;
                            }
                      
                            if (interceptionType.isLifecycleCallback())
                            {
                               if (!Void.TYPE.equals(method.getReturnType()))
                               {
                                  if (LOG.isWarnEnabled())
                                  {
                                    LOG.warn(getStandardIgnoredMessage(interceptionType, method.getJavaMethod()) + "does not have a void return type");
                                  }
                                  return false;
                               }
                      
                               Class<?>[] parameterTypes = method.getJavaMethod().getParameterTypes();
                      
                               if (forTargetClass && parameterTypes.length != 0)
                               {
                                  if (LOG.isWarnEnabled())
                                  {
                                     LOG.warn(getStandardIgnoredMessage(interceptionType, method.getJavaMethod()) + "is defined on the target class and does not have 0 arguments");
                                  }
                                  return false;
                               }
                      
                      
                      • 9. Re: Usage of a lifecycle Interceptor produces a WARN message in AS7
                        xiang yingbing Master

                        I copied and modified example codes from chapter 18 Page326 and page 328 in Enterprise.JavaBeans.3.1_6th.Edition.pdf.

                         

                        (ch18-interceptors\src\main\java\org\jboss\ejb3\examples\ch18\tuner)

                         

                         

                         

                        1. page 326 ********************************************************************************************************************************************

                        public class RecordingAuditor

                        {

                        /**

                        * Logger

                        */

                        private static final Logger log =

                        Logger.getLogger(RecordingAuditor.class.getName());

                        /**

                        * Writable store for incoming invocations; imagine this is available to us

                        * and that it'll either log or otherwise store persistently in a DB

                        */

                        private final Recorder<InvocationContext> invocations ; // We made up "Recorder"

                        /**

                        * Persistently records the intercepted {@link InvocationContext} such that

                        * we may examine it later

                        */

                        @AroundInvoke

                        public Object audit(final InvocationContext context) throws Exception

                        {

                        // Precondition checks

                        assert context != null : "Context was not specified";

                        // Record the invocation

                        invocations.add(context);

                        // Carry out the invocation, noting where we've intercepted

                        // before and after the call (around it)

                        try

                        {

                        // Log

                        log.info("Intercepted: " + context);

                        // Return

                        return context.proceed();

                        }

                        finally

                        {

                        // Log

                        log.info("Done with: " + context);

                        }

                        }

                        }

                         

                         

                        2. Page 328 ************************************************************************************************************************************************************************************

                         

                        @Stateless

                        // Class-level interceptors will be run upon requests to every method of this EJB

                        @Interceptors(RecordingAuditor.class)

                        @Local(TunerLocalBusiness.class)

                        public class TunerBean implements TunerLocalBusiness{

                        ...

                        }

                         

                         

                         

                         

                         

                         

                         

                         

                        Maybe what Andreas G  talked about is in page 333 or 338 (I did NOT read them carefully):

                         

                        3.  Page 333 -- Intercepting Lifecycle Events  ************************************************************************************************************************

                         

                        public class JndiInjector

                        {

                        @PostConstruct

                        public void jndiInject(InvocationContext invocation) {

                        ....

                         

                         

                         

                         

                        4. Page 338: **********************************************************************************************************************************************************

                         

                        @Stateless

                        public class MySessionBean implements MySessionRemote {

                        public void businessMethod( ) {

                        ...

                        }

                        @AroundInvoke

                        public Object beanClassInterceptor(InvocationContext ctx) {

                        try {

                        System.out.println("entering: " + ctx.getMethod( ));

                        return ctx.proceed( );

                        } finally {

                        System.out.println("leaving: " + ctx.getMethod( ));

                        }

                        }

                        }

                        • 10. Re: Usage of a lifecycle Interceptor produces a WARN message in AS7
                          xiang yingbing Master

                          I had read every edition of  "Enterprise.JavaBeans" serial books.

                          (Many chapters were NOT understood completely 4 years ago, but I like this book deeply. I like jboss documentation page too)

                          • 11. Re: Usage of a lifecycle Interceptor produces a WARN message in AS7
                            Andreas G Newbie

                            @xiang yingbing

                            Thank you for the workaround, unfortunately it does not work for me - the @PostConstruct annotated method is not called in that case.

                            I did not read the specification, but I assume, that @AroundInvoke invokes only 'normal' methods but not lifecycle-methods like @PostConstruct.

                             

                            @Nicklas Karlsson and @jaikiran pai

                            yes, we also use one or two CDI classes in our code and apart from that we inject our EJBs with @Inject instead of @EJB

                             

                             

                            ###################################################

                            By using the following code, the WARN message disappears:

                            ###################################################

                             

                                 @Interceptor                                   // new

                                 @LifecycleInterceptorBinding      // new

                                 public class LifecycleInterceptor {

                                     @PostConstruct

                                     private void postConstructInterceptor(InvocationContext ctx) {

                                         try {

                                             ctx.proceed();

                                         } catch (Throwable e) {

                                             // do sth.

                                         }

                                     }

                                 }

                             

                            and

                             

                                 @Singleton

                                 @Interceptors({LifecycleInterceptor.class})

                                 public class MyEJB {

                                    @PostConstruct

                                    private void init() {

                                            // do sth.

                                    }

                             

                                    // ... other methods

                                 }

                             

                            and the new LifecycleInterceptorBinding-Annotation:

                             

                                 @InterceptorBinding

                                 @Retention(RetentionPolicy.RUNTIME)

                                 @Target(ElementType.TYPE)

                                 public @interface LifecycleInterceptorBinding {}

                             

                            This code behaves as before (i.e. it behaves as the code without the @Interceptor and @LifecycleInterceptorBinding annotations), the only difference is that the WARN message disappears.

                             

                            What is the reason that for?