2012-05-15 49 views
1

我一直在調試很多很多小時,但我不明白爲什麼代碼不工作。 以相同方式註釋的兩個服務類顯示不同的攔截器行爲。Guice&EJB注入(攔截器?)

堆棧跟蹤#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  

堆棧跟蹤#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  

看來,如果攔截器不被調用的信息服務類。但是,它可以用於用戶服務類。爲什麼會這樣呢?

消息服務類:

@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; 

用戶服務類:

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

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

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

最後攔截:

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

希望有這個專家,我很沮喪;)

回答

3

問題是我無法在課程中的任何地方使用最終修飾符,或者它不適用於Guice。甚至不用輔助幫手方法。

0

您能否填寫誰在調用MessageService以及他們如何獲得對其的引用?

我的第一猜測是,不管是誰調用MessageService有直接參考實例本身,而不是調用通過經由任一@EJB MessageService service;注射或JNDI查找得到的容器創建的代理的豆。

請參閱this answer關於使用代理的重要性以及與使用this或類似的對bean實例的直接引用有何不同。