2014-02-28 18 views
0

我有在我宣佈我的靜態常量類:吉斯:與@Named註解的字段值爲null

public final class ConfigOptions { 
    public static final String FILE_PATH_SERVER = "/home/user/me/somefile"; 
} 

然後我用吉斯將它綁定在我ServletModule

public class MyServletModule extends ServletModule { 
    bind(String.class).annotatedWith(Names.named("filePath")) 
     .toInstance(ConfigOptions.FILE_PATH_SERVER); 

    // Also tried 
    // bindConstant().annotatedWith(Names.named("filePath")).to(ConfigOptions.FILE_PATH_SERVER) 

    // ... other bindings 
} 

GuiceServletContextListener

public class MyServletContextListener extends GuiceServletContextListener { 

    @Override 
    protected Injector getInjector() { 
     return Guice.createInjector(new MyServletModule()); 
    } 
} 

最後,我嘗試使用filePath

public class MyClass { 

    @Inject 
    @Named("filePath") 
    private String filePath; 

    public MyClass() { ... } 

    public void doSomething() { 
     someotherThing.setFilePath(filePath); // But filePath is null 
    } 
} 

我主要按照here所示的方法,但不確定是否遺漏了一些東西。

此外,我確保導入正確的import com.google.inject.name.Named

+1

你能否確認你讓Guice創建MyClass的實例,而不是用'new MyClass()'自己實例化它?通過現場噴射,如果您從未通過噴油器請求班級,該場會默默地保持「空」狀態。切換到構造函數注入也將有助於明確該類是否通過Guice提供。 –

+0

啊,你撞到了頭上!我不讓Guice創建MyClass(Guice noob在這裏)。注入MyClass反而解決了它。你應該可以讓它成爲答案。謝謝:) –

+0

完成。很高興爲您提供幫助,祝您好運! –

回答

5

確認您讓Guice創建您的MyClass實例,而不是使用new MyClass()自行實例化它們。即使字段被標記爲@Inject,Guice也只能在Guice負責創建包含它的實例*時設置該值。在現場注入的情況下,如果從未通過注入器請求該類,則該字段將默默保留爲空。

切換到構造器注入也將有助於更明顯地是否正在通過吉斯提供的類,因爲改變的構造本身將打破不打破吉斯創建引用任何直接調用:

public class MyClass { 

    private final String filePath; 

    @Inject public MyClass(@Named("filePath") String filePath) { 
    this.filePath = filePath; 
    // ... 
    } 

    // ... 
} 

*您也可以使用Injector.injectMembers(instance)Binder.requestInjection(instance)哄騙Guice注入現有實例。這些並不常見,並且可能會使您難以關注構建和注入實例的位置,但在遺留代碼和其他一些情況下可能會證明有用。