第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