2012-05-15 2 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 조회를 통해 얻은 컨테이너 작성 프록시를 통해 Bean을 호출하지 않는다고 가정합니다.

this answer은 프록시 사용의 중요성과 this 또는 이와 유사한 bean 인스턴스 직접 참조를 사용하는 것과 어떻게 다른지를 참조하십시오.