Carl
Carl

Reputation: 77

Guice & EJB injection (interceptor?)

I have been debugging for many, many hours but I can't understand why the code is not working. Two service classes, annotated in the same way, show a different interceptor behaviour.

Stack trace #1:

Daemon Thread [http-thread-pool-8080(1)] (Suspended (breakpoint at line 120 in UserService))    
    UserService.saveUserOnLogin(UserBE) line: 120   
    NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]  
    NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57  
    DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43  
    Method.invoke(Object, Object...) line: 601  
    EJBSecurityManager.runMethod(Method, Object, Object[]) line: 1052   
    EJBSecurityManager.invoke(Method, boolean, Object, Object[]) line: 1124 
    StatelessSessionContainer(BaseContainer).invokeBeanMethod(EjbInvocation) line: 5388 
    EjbInvocation.invokeBeanMethod() line: 619  
    AroundInvokeChainImpl.invokeNext(int, InterceptorManager$AroundInvokeContext) line: 800 
    EjbInvocation.proceed() line: 571   
    _GuiceInterceptor_Serializable(GuiceInterceptor).injectByGuice(InvocationContext) line: 24  
    NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]  
    NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57  
    DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43  
    Method.invoke(Object, Object...) line: 601  
    AroundInvokeInterceptor.intercept(InterceptorManager$AroundInvokeContext) line: 861 
    AroundInvokeChainImpl.invokeNext(int, InterceptorManager$AroundInvokeContext) line: 800 
    EjbInvocation.proceed() line: 571   
    _SystemInterceptorProxy_Serializable(SystemInterceptorProxy).doAround(InvocationContext, Method) line: 162  
    _SystemInterceptorProxy_Serializable(SystemInterceptorProxy).aroundInvoke(InvocationContext) line: 144  
    NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]  
    NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57  
    DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43  
    Method.invoke(Object, Object...) line: 601  
    AroundInvokeInterceptor.intercept(InterceptorManager$AroundInvokeContext) line: 861 
    AroundInvokeChainImpl.invokeNext(int, InterceptorManager$AroundInvokeContext) line: 800 
    InterceptorManager.intercept(InterceptorManager$InterceptorChain, InterceptorManager$AroundInvokeContext) line: 370 
    StatelessSessionContainer(BaseContainer).__intercept(EjbInvocation) line: 5360  
    StatelessSessionContainer(BaseContainer).intercept(EjbInvocation) line: 5348    
    EJBLocalObjectInvocationHandler.invoke(Class, Method, Object[]) line: 214   
    EJBLocalObjectInvocationHandlerDelegate.invoke(Object, Method, Object[]) line: 88   
    $Proxy209.saveUserOnLogin(UserBE) line: not available   
    __EJB31_Generated__UserService__Intf____Bean__.saveUserOnLogin(UserBE) line: not available  
    LoginUserHandler.saveUser(UserDTO) line: 165    
    LoginUserHandler.loginUser(UserDTO) line: 123   
    LoginUserHandler.loginWithOAuth(String, String, String, String) line: 158   
    LoginUserHandler.execute(LoginUser, ExecutionContext) line: 103 
    LoginUserHandler.execute(Action, ExecutionContext) line: 1  
    GuiceDispatch(AbstractDispatch).doExecute(A, ExecutionContext) line: 81 
    GuiceDispatch(AbstractDispatch).execute(A) line: 68 
    HupaDispatchServlet(AbstractSecureDispatchServlet).execute(String, Action<?>) line: 29  
    HupaDispatchServlet.execute(String, Action<?>) line: 56 
    NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]  
    NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57  
    DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43  
    Method.invoke(Object, Object...) line: 601  
    RPC.invokeAndEncodeResponse(Object, Method, Object[], SerializationPolicy, int) line: 569   
    HupaDispatchServlet(RemoteServiceServlet).processCall(String) line: 208 
    HupaDispatchServlet(RemoteServiceServlet).processPost(HttpServletRequest, HttpServletResponse) line: 248    
    HupaDispatchServlet(AbstractRemoteServiceServlet).doPost(HttpServletRequest, HttpServletResponse) line: 62  
    HupaDispatchServlet(HttpServlet).service(HttpServletRequest, HttpServletResponse) line: 688 
    HupaDispatchServlet(HttpServlet).service(ServletRequest, ServletResponse) line: 770 
    ServletDefinition.doService(ServletRequest, ServletResponse) line: 263  
    ServletDefinition.service(ServletRequest, ServletResponse) line: 178    
    ManagedServletPipeline.service(ServletRequest, ServletResponse) line: 91    
    FilterChainInvocation.doFilter(ServletRequest, ServletResponse) line: 62    
    ManagedFilterPipeline.dispatch(ServletRequest, ServletResponse, FilterChain) line: 118  
    GuiceFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 113    
    ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 256  
    ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 217  
    StandardWrapperValve.invoke(Request, Response) line: 279    
    StandardContextValve.invoke(Request, Response) line: 175    
    StandardPipeline.doInvoke(Request, Response, boolean) line: 655 
    StandardPipeline.invoke(Request, Response) line: 595    
    StandardHostValve.invoke(Request, Response) line: 161   
    CoyoteAdapter.doService(Request, Request, Response, Response) line: 331 
    CoyoteAdapter.service(Request, Response) line: 231  
    ContainerMapper$AdapterCallable.call() line: 317    
    ContainerMapper.service(Request, Response) line: 195    
    ProcessorTask.invokeAdapter() line: 849 
    ProcessorTask.doProcess() line: 746 
    ProcessorTask.process(InputStream, OutputStream) line: 1045 
    DefaultProtocolFilter.execute(Context) line: 228    
    HttpProtocolChain(DefaultProtocolChain).executeProtocolFilter(Context, int) line: 137   
    HttpProtocolChain(DefaultProtocolChain).execute(Context, int) line: 104 
    HttpProtocolChain(DefaultProtocolChain).execute(Context) line: 90   
    HttpProtocolChain.execute(Context) line: 79 
    ProtocolChainContextTask.doCall() line: 54  
    ProtocolChainContextTask(SelectionKeyContextTask).call() line: 59   
    ProtocolChainContextTask(ContextTask).run() line: 71    
    FixedThreadPool$BasicWorker(AbstractThreadPool$Worker).doWork() line: 532   
    FixedThreadPool$BasicWorker(AbstractThreadPool$Worker).run() line: 513  
    HttpWorkerThread(Thread).run() line: 722    

Stack trace #2

Daemon Thread [http-thread-pool-8080(2)] (Suspended (entry into method synchronizeHeaders in MessageService))   
__EJB31_Generated__MessageService__Intf____Bean__(MessageService).synchronizeHeaders(String) line: 93   
FetchMessagesHandler.executeInternal(FetchMessages, ExecutionContext) line: 80  
FetchMessagesHandler.executeInternal(Action, ExecutionContext) line: 1  
FetchMessagesHandler(AbstractSessionHandler<A,R>).executeWithRetries(A, ExecutionContext, int) line: 127    
FetchMessagesHandler(AbstractSessionHandler<A,R>).execute(A, ExecutionContext) line: 97 
GuiceDispatch(AbstractDispatch).doExecute(A, ExecutionContext) line: 81 
GuiceDispatch(AbstractDispatch).execute(A) line: 68 
HupaDispatchServlet(AbstractSecureDispatchServlet).execute(String, Action<?>) line: 29  
HupaDispatchServlet.execute(String, Action<?>) line: 56 
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]  
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57  
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43  
Method.invoke(Object, Object...) line: 601  
RPC.invokeAndEncodeResponse(Object, Method, Object[], SerializationPolicy, int) line: 569   
HupaDispatchServlet(RemoteServiceServlet).processCall(String) line: 208 
HupaDispatchServlet(RemoteServiceServlet).processPost(HttpServletRequest, HttpServletResponse) line: 248    
HupaDispatchServlet(AbstractRemoteServiceServlet).doPost(HttpServletRequest, HttpServletResponse) line: 62  
HupaDispatchServlet(HttpServlet).service(HttpServletRequest, HttpServletResponse) line: 688 
HupaDispatchServlet(HttpServlet).service(ServletRequest, ServletResponse) line: 770 
ServletDefinition.doService(ServletRequest, ServletResponse) line: 263  
ServletDefinition.service(ServletRequest, ServletResponse) line: 178    
ManagedServletPipeline.service(ServletRequest, ServletResponse) line: 91    
FilterChainInvocation.doFilter(ServletRequest, ServletResponse) line: 62    
ManagedFilterPipeline.dispatch(ServletRequest, ServletResponse, FilterChain) line: 118  
GuiceFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 113    
ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 256  
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 217  
StandardWrapperValve.invoke(Request, Response) line: 279    
StandardContextValve.invoke(Request, Response) line: 175    
StandardPipeline.doInvoke(Request, Response, boolean) line: 655 
StandardPipeline.invoke(Request, Response) line: 595    
StandardHostValve.invoke(Request, Response) line: 161   
CoyoteAdapter.doService(Request, Request, Response, Response) line: 331 
CoyoteAdapter.service(Request, Response) line: 231  
ContainerMapper$AdapterCallable.call() line: 317    
ContainerMapper.service(Request, Response) line: 195    
ProcessorTask.invokeAdapter() line: 849 
ProcessorTask.doProcess() line: 746 
ProcessorTask.process(InputStream, OutputStream) line: 1045 
DefaultProtocolFilter.execute(Context) line: 228    
HttpProtocolChain(DefaultProtocolChain).executeProtocolFilter(Context, int) line: 137   
HttpProtocolChain(DefaultProtocolChain).execute(Context, int) line: 104 
HttpProtocolChain(DefaultProtocolChain).execute(Context) line: 90   
HttpProtocolChain.execute(Context) line: 79 
ProtocolChainContextTask.doCall() line: 54  
ProtocolChainContextTask(SelectionKeyContextTask).call() line: 59   
ProtocolChainContextTask(ContextTask).run() line: 71    
FixedThreadPool$BasicWorker(AbstractThreadPool$Worker).doWork() line: 532   
FixedThreadPool$BasicWorker(AbstractThreadPool$Worker).run() line: 513  
HttpWorkerThread(Thread).run() line: 722    

It seems as if the interceptor is not invoked for the message service class. However, it does work for the user service class. Why could this be?

The message service class:

@Stateless
@Interceptors(GuiceInterceptor.class)
public class MessageService {

    /**
     * The gmail folder default.
     */
    private static final String GMAIL_ALL_MAIL = "[Gmail]/All Mail";

    /**
     * The IMAP store cache.
     */
    @Inject
    private IMAPStoreCache imapStoreCache;

    /**
     * The EJB resolver.
     */
    @Inject
    private EJBResolver ejbResolver;

The user service class:

@Stateless
@Interceptors(GuiceInterceptor.class)
public class UserService {

    /**
     * The entity manager.
     */
    @PersistenceContext(unitName = "hupa")
    private EntityManager em;

    /**
     * The session provider.
     */
    @Inject
    private Provider<HttpSession> sessionProvider;

And finally the interceptor:

public class GuiceInterceptor {

    @EJB
    private GuiceInjectorHolder injectorHolder;

    @AroundInvoke
    @AroundTimeout
    public Object injectByGuice(InvocationContext invocationContext) throws Exception {
        Injector injector = injectorHolder.getInjector();
        injector.injectMembers(invocationContext.getTarget());
        return invocationContext.proceed();
    }
}

Hope there are experts on this, I am frustrated ;)

Upvotes: 1

Views: 681

Answers (2)

Carl
Carl

Reputation: 46

The problem was that I could not use the final modifier anywhere in the class or it would not work with Guice. Not even on auxiliary helper methods.

Upvotes: 3

David Blevins
David Blevins

Reputation: 19368

Can you fill in details on who is invoking MessageService and how they obtained a reference to it?

My first guess is that whoever is invoking MessageService has a direct reference to the instance itself and is not invoking the bean via the container-created proxy that is obtained via either @EJB MessageService service; injection or JNDI lookup.

See this answer on the importance of using the proxy and how that differs from using the this or similar direct reference to the bean instance.

Upvotes: 0

Related Questions