2012-05-02 97 views
0

我想做字段級注入,所以我沒有當我的控制器被實例化,如通過「模型」,現場級注射杜松子酒

UserController controller = new UserController(/*No need to pass models here*/); 

但是我的應用程序將引發NullPointerException異常,在這裏我的代碼:

UserController.java

public class UserController implements Controller { 
     @Inject private UserModel model; 
     public UserController() { 
      model.doSomething(); // NullPointerException 
     } 
    } 

ClientGinModule.java

public class ClientGinModule extends AbstractGinModule { 
    @Override 
    protected void configure() { 
     bind(UserModel.class).in(Singleton.class); 
    } 
} 

可能是什麼問題?

+1

你確定你正在注射你的代孕嗎?如果你使用新的UserController(),那麼這就是你的問題,你應該使用'injector.getInstance(UserController.class);'。 –

+0

我明白了,所以野外注射可以嗎?我的意思是,如果我使用getInstance方法,UserModel不會爲空? – xybrek

+0

是的,使用getInstance(UserController.class)將注入所有可注入的字段。請注意,在構造函數中,這些字段還沒有被注入,但是在它們之後。如果你需要在構造函數中的一些值,唯一的方法是添加這些作爲您的構造函數的注入參數 –

回答

1

使用在吉斯

UserController controller = injector.getInstance(UserController.class); 

使用在晶晶:

// Declare a method returning a UserController on your interface extending Ginjector 
public UserController getUserController(); 

// When you need the controller, just call: 
injector.getUserController(); 

得到充分注入控制器。

+0

我使用Guice適應GWT這是GIN,所以我認爲我不能通過 – xybrek

+0

來調用injector.getIntance @xybrek我認爲你應該簡單地在你的界面上聲明一個方法'public UserController getUserController()'來擴展Ginjector,它將完成剩下的工作。然後爲了得到你的控制器,只需調用'injector.getUserController()' –

+0

@downvoter謹慎解釋爲什麼downvote?特別是在6個月前提供的答案上? –

0

當構造函數仍在運行時,您的model字段將爲空。當UserController對象完全創建時,它將由GIN注入。這裏GWT GIN Field Level Injection你可以找到很好的解釋。