将@SessionScoped CDIBean注入JSF@ManagedBean后的实例null

将@SessionScoped CDIBean注入JSF@ManagedBean后的实例null,jsf,cdi,inject,Jsf,Cdi,Inject,我有: -存储库类: @SessionScoped public class EmployeeRepository { @PersistenceContext EntityManager entityManager; public List<Employee> getEmployees(){ TypedQuery<Employee> qu = entityManager.createQuery("select * from Empl

我有: -存储库类:

@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;
    }
}
和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>
问题:

页面引发nullpointer异常,因为EmployeeRepository未注入HelloWorldBean中


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

当您使用CDI时,您不应该使用
@ManagedBean
(这是一个JSF注释)。虽然我确实看到了这一点,但大多数实现都不允许将CDIBean注入到经典的JSFbean中

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

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

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

    public String getEmployees() {
        return String.valueOf(employeerepo.getEmployees().size());
    }
}
你也可以通过网站上的一些老问答进一步了解这个话题


在使用CDI时,不应该使用
@ManagedBean
(这是一个JSF注释)。虽然我确实看到了这一点,但大多数实现都不允许将CDIBean注入到经典的JSFbean中

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

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

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

    public String getEmployees() {
        return String.valueOf(employeerepo.getEmployees().size());
    }
}
你也可以通过网站上的一些老问答进一步了解这个话题



您使用的是哪个版本的CDI?javaee-api-6.0.jar。beans_1_1.xsd。我的beans.xml在src\META-INF\Ok中,beans\u 1\u 1是CDI 1.1。在beans.xml中是否有
bean发现模式
属性?价值是多少?顺便说一下,CDI1.1是JavaEE7,而JavaEE6API……我已经在问题中添加了beans.xml的内容。感谢您的帮助。您使用的是哪个应用服务器或servlet容器(和版本)?您使用的是哪个版本的CDI?javaee-api-6.0.jar。beans_1_1.xsd。我的beans.xml在src\META-INF\Ok中,beans\u 1\u 1是CDI 1.1。在beans.xml中是否有
bean发现模式
属性?价值是多少?顺便说一下,CDI1.1是JavaEE7,而JavaEE6API……我已经在问题中添加了beans.xml的内容。感谢您的帮助。您正在使用哪个应用程序服务器或servlet容器(和版本)?感谢您的帮助。对于新代码,xhtml似乎找不到我的bean。不调用HelloWorldBean。有什么帮助吗?@mcflysoft确保您调用的是
helloWorldBean
,而不是
helloWorldBean
。任何类名都将获得一个带有camel大小写符号的变量(除非您明确指定它的名称)。还要确保在完全支持CDI的环境中运行应用程序。Tomcat7不是现成的,需要额外的配置。我建议您研究一个成熟的JavaEE服务器,它具有JavaEE/JakartaEE的最新实现,如Payara、GlassFish或WildFly.或TomEE;-)是的,实际上这是一个新问题fpr,有几个相关的q/anstackoverflow@Kukeltje这几天汤姆完全是最新的吗?上一次我尝试它时,我不得不胡闹,做了很多额外的配置步骤,以使一切正常工作。上一次我尝试它工作得还行,但那只是一次尝试,没有jms,但有cdi、jsf、ejb和1.5年前。我通常用Wildfly。谢谢你的帮助。对于新代码,xhtml似乎找不到我的bean。不调用HelloWorldBean。有什么帮助吗?@mcflysoft确保您调用的是
helloWorldBean
,而不是
helloWorldBean
。任何类名都将获得一个带有camel大小写符号的变量(除非您明确指定它的名称)。还要确保在完全支持CDI的环境中运行应用程序。Tomcat7不是现成的,需要额外的配置。我建议您研究一个成熟的JavaEE服务器,它具有JavaEE/JakartaEE的最新实现,如Payara、GlassFish或WildFly.或TomEE;-)是的,实际上这是一个新问题fpr,有几个相关的q/anstackoverflow@Kukeltje这几天汤姆完全是最新的吗?上一次我尝试它时,我不得不胡闹,做了很多额外的配置步骤,以使一切正常工作。上一次我尝试它工作得还行,但那只是一次尝试,没有jms,但有cdi、jsf、ejb和1.5年前。我通常用野蝇。
@Named
@RequestScoped
public class HelloWorldBean {
    @Inject
    private EmployeeRepository employeerepo;
    public String getMsg() {
        return "Hallo";
    }

    public String getEmployees() {
        return String.valueOf(employeerepo.getEmployees().size());
    }
}