2017-03-09 48 views
1

我是新來Guice和努力實現依賴注入在我下面的家庭如下類別:吉斯注入某處失敗的注射層次

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

但是有一些問題,由於其我的要求並不成功。

如果我只是用新的如下代替管理器中的兩個注入它工作正常。

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

你能否幫我找出問題,並讓我知道你是如何調試Guice中的依賴注入問題的?

+0

Manager內部的dao和converter都變成了null,導致NullPointerException。任何想法爲什麼@Inject不在這裏工作? – abhishek08aug

回答

1

你需要通過guice綁定你的servlet。爲此,您需要遵循以下步驟。

創建一個Servlet模塊添加servlet綁定。

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

您還可以添加servlet映射到模塊中,你已經創建了,如果你不想創建單獨的模塊,但你需要從servlet模塊派生模塊。

創建Guice 聽衆如下。

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

在您的web.xml中添加監聽器標籤。

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

添加吉斯過濾到web.xml中映射過濾器服務器URL模式。

<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>