[英]Instance null after injecting @SessionScoped CDI bean into a JSF @ManagedBean
我有:-存儲庫類:
@SessionScoped
public class EmployeeRepository {
@PersistenceContext
EntityManager entityManager;
public List<Employee> getEmployees(){
TypedQuery<Employee> qu = entityManager.createQuery("select * from Employee", Employee.class);
List<Employee> emp2 = qu.getResultList();
return emp2;
}
}
和
托管Bean:
@ManagedBean(name = "helloWorldBean")
public class HelloWorldBean {
@Inject
private EmployeeRepository employeerepo;
public String getMsg() {
return "Hallo";
}
public String getEmployees() {
return String.valueOf(employeerepo.getEmployees().size());
}
}
和一個JSF頁面:
<h:head>
<title>JavaCodeGeeks</title>
</h:head>
<h:body>
- Message : <h:outputText value="#{helloWorldBean.msg}" />
- Employee count : <h:outputText value="#{helloWorldBean.employees}" />
</h:body>
</html>
我的META-INF文件夾(src \\ META-INF)中有一個beans.xml
,沒有特殊配置:
<?xml version="1.0"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all" version="1.1">
</beans>
問題:
頁面引發nullpointer異常,因為EmployeeRepository沒有注入到HelloWorldBean中。
在我的情況下可以注入類的實例怎么辦?
使用CDI時,不應使用@ManagedBean
(這是JSF批注)。 雖然我實際上已經看到了這一功能,但是大多數實現都不允許您將CDI bean注入經典的JSF bean中。
為了允許CDI注射在JSF豆,CDI規范允許用戶通過指定定義JSF支持豆@Named
組合注解與范圍( @RequestScoped
, @javax.faces.view.ViewScoped
, @SessionScoped
和@ApplicationScoped
)。
因此,總而言之,以下代碼應該可以解決您的問題,
@Named
@RequestScoped
public class HelloWorldBean {
@Inject
private EmployeeRepository employeerepo;
public String getMsg() {
return "Hallo";
}
public String getEmployees() {
return String.valueOf(employeerepo.getEmployees().size());
}
}
您還可以通過網站上的一些舊問題來進一步閱讀該主題,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.