我有以下代码:
import javax.inject.Inject; import models.Subject; import models.dao.SchoolDao; import models.dao.SubjectDao; import play.Application; import play.GlobalSettings; import play.db.jpa.JPA; import play.db.jpa.Transactional; import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; public class Global extends GlobalSettings{ private Injector injector; @Inject private SubjectDao subjectDao; @Override public void onStart(Application application) { injector = Guice.createInjector(new AbstractModule() { @Override protected void configure() { bind(SchoolDao.class); bind(SubjectDao.class); } }); insertInitialData(); } @Override public A getControllerInstance(Class aClass) throws Exception { return injector.getInstance(aClass); } @Transactional private void insertInitialData(){ if(subjectDao.countAll() == 0){ Subject deutsch = new Subject(); deutsch.setName("Deutsch"); subjectDao.create(deutsch); Subject englisch = new Subject(); deutsch.setName("Englisch"); subjectDao.create(englisch); Subject mathe = new Subject(); deutsch.setName("Mathematik"); subjectDao.create(mathe); Subject hab = new Subject(); deutsch.setName("Hausaufgabenbetreuung"); subjectDao.create(hab); } } }
如您所见,我想在启动时使用初始值为我的数据库设定种子.我有一个应该注入的数据访问对象"subjectDao".这适用于我的应用程序的其他位置,但由于某些原因不适用于应用程序启动.我得到一个NullPointerException,我的subjectDao为null.有人有个主意.
看起来你实际上没有注入任何东西Global
,你只是绑定你的类(并处理控制器注入,但这是无关紧要的).
你应该通过调用eg来做到这一点.Injector.injectMembers(this)
得到subjectDao
你的Global
正确注射.