将@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());
}
}