我创建了一个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.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
这段代码运行良好。但是当我像这样更改代码时
<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
然后我得到异常
SEVERE: Error Rendering View[/index.xhtml]
com.sun.faces.mgbean.ManagedBeanCreationException: Cant instantiate class: pk.mazars.basitMahmood.HelloBasit.
at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:193)
at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:102)
......
为什么我会收到此异常?流程应该是我理解的是当我的页面遇到 #{helloBasit.label}
然后我的构造函数被调用,实例变量被初始化,将 bean 实例注入(inject) basitBean,然后 bean 方法应该调用.但是在这种情况下我在 bean 实例中得到 null 为什么?为什么以前的代码可以工作而不能?我如何从构造函数中调用 bean?
谢谢。
最佳答案
尝试将构造函数的内容移动到后构造函数中......
像这样
@PostConstruct
private void init() {
System.out.println();
String label = basitBean.helloBasit();
System.out.println(label);
}
因为 ejb bean 应该只在托管 bean 启动后注入(inject)
@PostConstruct
在构造函数之后运行(之后托管 bean 本身由 JSF 创建),然后才将 EJB 注入(inject)到 bean 中并可以访问...
关于jsf-2 - EJB 方法不是从构造函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12576689/