1

私は何時間もデバッグを続けてきましたが、コードが機能しない理由がわかりません。同じ方法で注釈が付けられた2つのサービスクラスは、異なるインターセプターの動作を示します。

スタックトレース#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();
    }
}

これに関する専門家がいることを願っています、私はイライラしています;)

4

2 に答える 2

3

問題は、クラスのどこでも final 修飾子を使用できないか、Guice で機能しないことでした。補助ヘルパーメソッドでもありません。

于 2012-05-17T08:52:06.577 に答える
0

誰が呼び出しMessageServiceているのか、どのようにしてそれへの参照を取得したのかについて詳しく教えてください。

私の最初の推測では、呼び出しMessageServiceている人はインスタンス自体を直接参照しており、@EJB MessageService service;インジェクションまたはJNDIルックアップのいずれかを介して取得されたコンテナー作成プロキシを介してBeanを呼び出していません。

プロキシを使用することの重要性と、それがBeanインスタンスへのまたは同様の直接参照を使用することとどのように異なるかについては、この回答を参照してください。this

于 2012-05-15T05:13:23.693 に答える