将@SessionScoped CDI bean注入JSF @ManagedBean后,实例为null

时间:2019-01-09 15:54:56

标签: jsf cdi inject

我有: -储存库类别:

@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中。

如何在我的案例中注入类的实例?

1 个答案:

答案 0 :(得分:4)

使用CDI时,不应使用@ManagedBean(这是JSF批注)。虽然我实际上已经看到了这一功能,但是大多数实现都不允许您将CDI bean注入经典的JSF bean中。

要允许在JSF bean中进行CDI注入,CDI规范允许您通过指定@Named批注与范围(@RequestScoped@javax.faces.view.ViewScoped,{ {1}}和@SessionScoped)。

因此,总而言之,下面的代码应该可以解决您的问题,

@ApplicationScoped

您还可以通过网站上的一些旧问题来进一步阅读该主题,

How to inject a CDI Bean in a ManagedBean?

@ManagedProperty does not work in a CDI managed bean

CDI beans injection