2 Replies Latest reply on Jul 31, 2006 2:29 PM by andrew.rw.robinson

    Is a custom method interceptor in a POJO possible?

    andrew.rw.robinson

      I have an issue in which a 3rd party control is attempting to access a bean property of a conversation state bean during the decode phase. This property returns null (which the 3rd party control hates) when there is no conversation. So I thought that I would add a custom method interceptor on the get property method to check if the conversation is active and if not, immediately invoke the navigation handler (unlike the @Conversational which doesn't change the navigation for non-action methods).

      After developing it, it almost looks like Seam 1.0.1 doesn't support custom method-level interceptors on POJOs. Is this true?

      Here is my code:
      Bean class:

      @Name("editReportBean")
      @Scope(ScopeType.CONVERSATION)
      public class EditReportBean
      {
       ...
       @ConversationRequired(ifNotBegunOutcome="return.report.list")
       public TreeModel getAvailTreeModel()
       {
       return this.availTreeModel;
       }


      Interceptor:
      @Target({TYPE, METHOD})
      @Retention(RUNTIME)
      @Interceptors(ConversationRequiredInterceptor.class)
      public @interface ConversationRequired
      {
       /**
       * The JSF outcome if the component is invoked outside
       * of the scope of its conversation
       */
       String ifNotBegunOutcome();
      }


      The interceptor implementation:
      @Around({BijectionInterceptor.class,
       ValidationInterceptor.class,
       ConversationInterceptor.class})
      @Within({RemoveInterceptor.class})
      public class ConversationRequiredInterceptor
      {
       @AroundInvoke
       public Object ensureActiveConversation(InvocationContext invocation)
       throws Exception
       {
       Method method = invocation.getMethod();
      
       if (!Manager.instance().isLongRunningConversation())
       {
       String outcome = method.getAnnotation(ConversationRequired.class).ifNotBegunOutcome();
       FacesContext context = FacesContext.getCurrentInstance();
       context.getApplication().getNavigationHandler().handleNavigation(context,
       null, outcome);
       throw new AbortProcessingException();
       }
      
       return invocation.proceed();
       }
      }


      The "ensureActiveConversation" method of the interceptor implementation class is never invoked.

      Is this possible? What else can I do to stop this (I will probably put a work around in, but would like to know if I can get custom interceptors to work on POJO methods).

      Thanks,
      ANdrew