Jsf 2 EJB方法未从构造函数调用
我创建了一个ejbJsf 2 EJB方法未从构造函数调用,jsf-2,ejb-3.0,Jsf 2,Ejb 3.0,我创建了一个ejb @Stateless @LocalBean public class BasitBean { public String helloBasit() { return "Basit"; } //end of helloBasit() } //end of class BasitBean 我从JSF调用它,就像 <h:body> <h:outputLabel value="#{helloBasit.cal
@Stateless
@LocalBean
public class BasitBean {
public String helloBasit() {
return "Basit";
} //end of helloBasit()
} //end of class BasitBean
我从JSF调用它,就像
<h:body>
<h:outputLabel value="#{helloBasit.callBasit()}" />
</h:body>
@ManagedBean
@SessionScoped
public class HelloBasit {
@EJB
private BasitBean basitBean;
/** Creates a new instance of HelloBasit */
public HelloBasit() {
}
public String callBasit() {
return basitBean.helloBasit();
} //end of callBasit()
} //end of class HelloBasit
为什么我会得到这个例外?这个流程应该是我所理解的,当我的页面遇到{helloBasit.label}
然后我的构造函数得到调用,实例变量得到初始化,将bean实例注入基本bean,然后bean方法应该调用。但是我在bean实例中得到null,在这种情况下为什么?为什么以前的代码可以工作而现在不行?如何从构造函数调用bean
谢谢。尝试将构造函数的内容移动到后构造函数中,而不是 像这样
<h:body>
<h:outputLabel value="#{helloBasit.label}" />
</h:body>
@ManagedBean
@SessionScoped
public class HelloBasit {
@EJB
private BasitBean basitBean;
String label;
/** Creates a new instance of HelloBasit */
public HelloBasit() {
System.out.println();
String label = basitBean.helloBasit();
System.out.println(label);
}
public BasitBean getBasitBean() {
return basitBean;
}
public void setBasitBean(BasitBean basitBean) {
this.basitBean = basitBean;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
} //end of class HelloBasit
@PostConstruct
private void init() {
System.out.println();
String label = basitBean.helloBasit();
System.out.println(label);
}
原因只有在托管bean启动之后,才应该注入ejb bean
@PostConstruct
是在构造函数之后运行的(之后托管bean本身是由JSF创建的),只有在那时EJB才被注入bean并可以访问…尝试将构造函数的内容移动到post构造函数中
像这样
<h:body>
<h:outputLabel value="#{helloBasit.label}" />
</h:body>
@ManagedBean
@SessionScoped
public class HelloBasit {
@EJB
private BasitBean basitBean;
String label;
/** Creates a new instance of HelloBasit */
public HelloBasit() {
System.out.println();
String label = basitBean.helloBasit();
System.out.println(label);
}
public BasitBean getBasitBean() {
return basitBean;
}
public void setBasitBean(BasitBean basitBean) {
this.basitBean = basitBean;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
} //end of class HelloBasit
@PostConstruct
private void init() {
System.out.println();
String label = basitBean.helloBasit();
System.out.println(label);
}
原因只有在托管bean启动之后,才应该注入ejb bean
@PostConstruct
是在构造函数之后运行的(之后托管bean本身是由JSF创建的),只有在那时EJB才被注入bean并可以访问…您的想法是正确的,但是我看到一些事情可能会被修复
- 如果EJB没有直接实现接口,则不需要使用
注释。在本例中,无论是否使用@LocalBean
注释,都具有相同的效果。不过,如果你想把它说清楚的话,你可以把它留下。看@LocalBean
- 确保
和@ManagedBean
从@SessionScoped
包导入javax.faces.bean
我希望有帮助 你的想法是正确的,但我发现有些问题可能会解决
- 如果EJB没有直接实现接口,则不需要使用
注释。在本例中,无论是否使用@LocalBean
注释,都具有相同的效果。不过,如果你想把它说清楚的话,你可以把它留下。看@LocalBean
- 确保
和@ManagedBean
从@SessionScoped
包导入javax.faces.bean
我希望有帮助 是的,它正在工作:)所以托管bean没有在构造函数中初始化。。。。谁先跑?构造函数还是PostConstruct?@Basit更新了我的答案,首先是正在运行构造函数,然后是PostConstruct(这就是为什么它的前缀是Post:):)是的,这就是为什么它是Post:)。无论如何,谢谢你,伙计;)啊,太感谢你了,你刚刚让我不用在调试我的项目上浪费时间了!:)是的,它正在工作:)所以托管bean没有在构造函数中初始化。。。。谁先跑?构造函数还是PostConstruct?@Basit更新了我的答案,首先是正在运行构造函数,然后是PostConstruct(这就是为什么它的前缀是Post:):)是的,这就是为什么它是Post:)。无论如何,谢谢你,伙计;)啊,太感谢你了,你刚刚让我不用在调试我的项目上浪费时间了!:)
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class PersonBean {
@EJB
private PersonService ps;
private String name;
@PostConstruct
public void init() {
name = ps.getName();
}
public String getName() {
return name;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<f:view contentType="text/html">
<h:head>
<title>Test</title>
</h:head>
<h:body>
<h1>Welcome, #{personBean.name}</h1>
</h:body>
</f:view>
</html>
<f:event type="preRenderView" listener="#{personBean.init}" />