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

mcf*_*oft 1 jsf inject cdi

我有: - 存储库类:

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

托管 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

和一个 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>
Run Code Online (Sandbox Code Playgroud)

beans.xml我的 META-INF 文件夹 (src\META-INF) 中有一个没有特殊配置的:

<?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>
Run Code Online (Sandbox Code Playgroud)

问题:

页面抛出空指针异常,因为 EmployeeRepository 没有注入到 HelloWorldBean 中。

在我的例子中如何才能注入类的实例?

Ada*_*erg 5

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

为了允许在 JSF bean 中进行 CDI 注入,CDI 规范允许您通过指定@Named注释与范围(@RequestScoped@javax.faces.view.ViewScoped@SessionScoped)相结合来定义 JSF 支持 bean @ApplicationScoped

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

@Named
@RequestScoped
public class HelloWorldBean {
    @Inject
    private EmployeeRepository employeerepo;
    public String getMsg() {
        return "Hallo";
    }

    public String getEmployees() {
        return String.valueOf(employeerepo.getEmployees().size());
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以通过网站上的一些旧问答进一步了解该主题,

如何在 ManagedBean 中注入 CDI Bean?

@ManagedProperty 在 CDI 托管 bean 中不起作用

CDI豆注射液