第1類:Repository.java:依賴注入和JPA和Hibernate
@ApplicationScoped
public class Repository {
@Inject
private EntityManager em;
public Term findById(Long id) {
return em.find(Term.class, id);
}
}
二級:Word.java
@Named
@RequestScoped
public class Word {
@Inject
private Logger log;
@Inject
private Repository repository;
private Term term;
public Word() {
}
public Word(Long id) {
try{
term = this.findTermById(id);
}catch(Exception e) {
e.printStackTrace();
}
}
@Produces
@Named
public Term getTerm() {
return term;
}
public Term findTermById(Long id) {
Term term = repository.findById(id);
if(term==null) {
log.info("Can't find this word from database: " + term);
}
return term;
}
}
3類:Resources.java
public class Resources {
@Produces
@PersistenceContext
private EntityManager em;
@Produces
public Logger produceLog(InjectionPoint injectionPoint) {
return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
}
@Produces
@RequestScoped
public FacesContext produceFacesContext() {
return FacesContext.getCurrentInstance();
}
}
的這兩個類的問題是,在運行服務器時,會在該行引發NullPointerException:
Term term = repository.findById(id);
這意味着由於調試顯示「repository = null」,所以注入對象'repository'失敗。
@Inject
private Repository repository;
爲什麼注射不成功?謝謝。
如何獲得對Word實例的引用?異常的堆棧跟蹤是什麼? –
問題出在你的'Word'構造函數中 - 你想使用依賴關係,但在構造函數中它們還沒有被注入。不要在CDI中使用構造函數,將所有邏輯從那裏移動到帶有註釋'@ PostConstruct'的方法。如果遇到任何進一步的問題(如果一個類有'@ Produces'方法需要'注入點'參數**它必須**是依賴範圍的),那麼也用'@ Dependent'註釋你的'Resource'類。 – Geinmachi
@Geinmachi,問題是如何將參數「Id」傳遞給Word對象,以創建它?我可以將構造函數移動到PostConstruct方法,但何時調用此方法來執行初始化? – ling