2017-03-09 5 views
1

Ich bin neu in Guice und versuchen, Dependency Injection in meinem unten Familie von Klassen, wie unten zu erreichen:Guice Injektion nicht irgendwo in Injektion Hierarchie

class DoSomethingServlet { 
    @Inject 
    IProvider provider; 
} 

interface IProvider { 

} 

@Singleton 
class Provider implements IProvider { 

    @Inject 
    @Named("B") 
    IManager manager; 
} 

interface IManager { 

} 

class Manager implements IManager { 

    @Inject 
    @Named("B") 
    IDAO dao; 

    @Inject 
    @Named("B") 
    IConverter converter; 
} 

interface IDAO { 

} 

class DAO implements IDAO { 

} 

interface IConverter { 

} 

class Converter implements IConverter { 

} 

import com.google.inject.AbstractModule; 

class DoSomethingModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(IProvider.class).to(Provider.class); 
     bind(IManager.class).annotatedWith(Names.named("B")) 
      .to(Manager.class); 
     bind(IDAO.class).annotatedWith(Names.named("B")).to(DAO.class); 
     bind(IConverter.class).annotatedWith(Names.named("B")) 
      .to(Converter.class); 
    } 
} 

Allerdings gibt es einige Problem ist aufgrund der meine Anfrage nicht gelingt .

Wenn ich nur die zwei injects in Manager mit neuen wie folgt ersetzen, funktioniert es gut.

IDAO dao = new DAO(); 
IConverter converter = new Converter(); 

Könnten Sie mir bitte helfen in Spek mir das Problem und auch wissen, wie Sie Dependency Injection Probleme in Guice im Allgemeinen debuggen?

+0

Sowohl dao als auch converter innerhalb des Managers sind null, was zu NullPointerException führt. Irgendeine Idee warum funktioniert @Inject hier nicht? – abhishek08aug

Antwort

1

Sie müssen Ihr Servlet über Guice binden. Dazu müssen Sie die folgenden Schritte befolgen.

Erstellen Sie ein Servlet-Modul, um eine Servlet-Bindung hinzuzufügen.

public class YourServletModule extends ServletModule { 
    @Override 
    protected void configureServlets() { 
     serve("YOUR SERVLET URL").with(DoSomethingServlet.class); 
     bind(DoSomethingServlet.class).in(Singleton.class); 
    } 
} 

Sie können auch Servletzuordnung in den Sie bereits Modul erstellt haben, wenn Sie nicht eigenes Modul erstellen möchten, aber dann müssen Sie das Modul von ServletModule abzuleiten.

erstellen Guice Zuhörer wie unten.

public class YourContextListener extends GuiceServletContextListener{ 
    @Override 
    public Injector getInjector(){ 
     return Guice.createInjector(new DoSomethingModule(),new YourServletModule()); 
    } 
} 

Fügen Sie Listener-Tag in Ihrer web.xml hinzu. In

<listener> 
    <listener-class>qualified class name of YourContextListener</listener-class> 
</listener> 

guice Filter web.xml Filter zur Karte URL-Muster Servlet.

<filter> 
    <filter-name>guiceFilter</filter-name> 
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>guiceFilter</filter-name> 
    <url-pattern>YOUR SERVLET URL</url-pattern> 
</filter-mapping>