2012-03-26 4 views
1

Я использую gwt dispatch для связи и получения данных от сервера к клиенту.Провайдер <HttpSession> не впрыскивается

Для того, чтобы получить конкретные данные пользователя, я хочу, чтобы сохранить объект пользователя в HTTPSession и приложений доступа к определенным данным из контекста сервлета

, но когда я впрыснуть Provider<HttpSession> когда обработчик выполнения вызывается, но dispatchservlet провайдер является нулевым т.е. он не вводится.

следующий код из моего обработчика

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

действий и моего диспетчерского сервлета

@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; является нулевым

Try:

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

благодаря ajozwik, вы ответите работали .. но я не уверен, почему инъекции поля не работают .. :(Я обновил код отправки сервлета выше .. это используя полевую инъекцию .. не могли бы вы сказать мне, что там не так? –

+0

Попробуйте отладить ваш код. Может быть, guice first вызывает конструктор, а затем инициализированные поля. –

+0

Вставка поля происходит автоматически, если Guice создает класс. Если конструктор объект не вызывается Guice, вам нужно вызвать 'injector.injectMembers (instance)', в соответствии с комментарием robertba ... @ google.com, 21 декабря 2012 года на http://code.google.com/p/ Google-Guice/Wik I/Инъекции. – FrankPl

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

Возможно ли, что в DefaultActionHandlerRegistry есть ошибка в строке 21, и что ошибка там происходит? Я не вижу код для этого класса, поэтому неясно, является ли это причиной вашей проблемы или просто симптомом.

Смежные вопросы