2012-03-26 59 views
1

我正在使用gwt dispatch進行通信並從服務器獲取數據到客戶端。供應商<HttpSession>未注入

爲了得到我想要存儲在HttpSession中和訪問應用程序特定數據的用戶對象從servlet上下文

,但是當我注入Provider<HttpSession>當處理程序中執行的調用,但在dispatchservlet provider爲null用戶特定數據即它沒有被注入。

以下是從我的行動處理器

@Inject 
Provider<HttpSession> provider; 

public ReadEntityHandler() { 

} 

@Override 
public EntityResult execute(ReadEntityAction arg0, ExecutionContext arg1) throws DispatchException { 
    HttpSession session = null; 
    if (provider == null) 
     System.out.println("httpSession is null.."); 
    else { 
     session = provider.get(); 
     System.out.println("httpSession not null.."); 
    } 
    System.out.println("reached execution"); 
    return null; 
} 

和我調度的servlet代碼

@Singleton 
public class ActionDispatchServlet extends RemoteServiceServlet implements StandardDispatchService { 

    private Dispatch dispatch; 

      private Dispatch dispatch; 
@Inject ReadEntityHandler readEntityHandler; 

public ActionDispatchServlet() { 
    InstanceActionHandlerRegistry registry = new DefaultActionHandlerRegistry(); 
    registry.addHandler(readEntityHandler); 
    dispatch = new SimpleDispatch(registry); 
} 


    @Override 
    public Result execute(Action<?> action) throws DispatchException { 
     try { 
      return dispatch.execute(action); 
     } 
     catch (RuntimeException e) { 
      log("Exception while executing " + action.getClass().getName() + ": " + e.getMessage(), e); 
      throw e; 
     } 
    } 
} 

當我嘗試注入ReadEntityHandler它拋出以下異常

[WARN] failed guiceFilter 
com.google.inject.ProvisionException: Guice provision errors: 

1) Error injecting constructor, java.lang.NullPointerException 
    at com.ensarm.wikirealty.server.service.ActionDispatchServlet.<init>(ActionDispatchServlet.java:22) 
    at com.ensarm.wikirealty.server.service.ActionDispatchServlet.class(ActionDispatchServlet.java:22) 
    while locating com.ensarm.wikirealty.server.service.ActionDispatchServlet 

1 error 
    at com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:834) 
    at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:856) 
    at com.google.inject.servlet.ServletDefinition.init(ServletDefinition.java:74) 
    at com.google.inject.servlet.ManagedServletPipeline.init(ManagedServletPipeline.java:84) 
    at com.google.inject.servlet.ManagedFilterPipeline.initPipeline(ManagedFilterPipeline.java:106) 
    at com.google.inject.servlet.GuiceFilter.init(GuiceFilter.java:168) 
    at org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:97) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:593) 
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140) 
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1220) 
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:513) 
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448) 
    at com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWithReload.doStart(JettyLauncher.java:468) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
    at org.mortbay.jetty.handler.RequestLogHandler.doStart(RequestLogHandler.java:115) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
    at org.mortbay.jetty.Server.doStart(Server.java:222) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at com.google.gwt.dev.shell.jetty.JettyLauncher.start(JettyLauncher.java:672) 
    at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:509) 
    at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1068) 
    at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:811) 
    at com.google.gwt.dev.DevMode.main(DevMode.java:311) 
Caused by: java.lang.NullPointerException 
    at net.customware.gwt.dispatch.server.DefaultActionHandlerRegistry.addHandler(DefaultActionHandlerRegistry.java:21) 
    at com.ensarm.wikirealty.server.service.ActionDispatchServlet.<init>(ActionDispatchServlet.java:24) 
    at com.ensarm.wikirealty.server.service.ActionDispatchServlet$$FastClassByGuice$$e0a28a5d.newInstance(<generated>) 
    at com.google.inject.internal.cglib.reflect.FastConstructor.newInstance(FastConstructor.java:40) 
    at com.google.inject.internal.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:58) 
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84) 
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:200) 
    at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:43) 
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:878) 
    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) 
    at com.google.inject.Scopes$1$1.get(Scopes.java:64) 
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40) 
    at com.google.inject.internal.InjectorImpl$4$1.call(InjectorImpl.java:825) 
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:871) 
    at com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:821) 
    ... 25 more 

回答

0

您自己並不是通過容器創建ReadEntityHandler實例registry.addHandler(new ReadEntityHandler());Provider<HttpSession> provider;是空

嘗試:

@Inject 
public ActionDispatchServlet(ReadEntityHandler handler) { 
     InstanceActionHandlerRegistry registry = new DefaultActionHandlerRegistry(); 
     registry.addHandler(handler); 
     dispatch = new SimpleDispatch(registry); 
    } 
+0

感謝ajozwik,您回覆的工作..但我不知道爲什麼領域注入不行.. :(我更新以上..這是調度servlet代碼使用字段注入..你能告訴我什麼時候出錯嗎? – 2012-03-27 05:40:05

+0

嘗試調試你的代碼。也許guice首先調用構造函數,然後初始化字段 – 2012-03-27 06:26:43

+0

如果Guice構造類,字段注入只會自動發生。對象不被Guice調用,根據Robertbert評論@@ google.com,2012年12月21日http://code.google.com/p/中的說明,您必須調用'injector.injectMembers(instance)'。谷歌-吉斯/ WIK I /注射。 – FrankPl 2013-03-27 20:31:20

0
Caused by: java.lang.NullPointerException 
    at net.customware.gwt.dispatch.server.DefaultActionHandlerRegistry.addHandler(DefaultActionHandlerRegistry.java:21) 

是否有可能DefaultActionHandlerRegistry在第21行有一個錯誤,並且錯誤在那裏發生?我沒有看到該類的代碼,所以不清楚這是你的問題的原因,還是僅僅是一個症狀。

相關問題