EJB方法不是从构造函数调用

Bas*_*sit 1 ejb-3.0 jsf-2

我创建了一个ejb

@Stateless
@LocalBean   
public class BasitBean {

    public String helloBasit() {

        return "Basit";

    } //end of helloBasit()

} //end of class BasitBean
Run Code Online (Sandbox Code Playgroud)

我是从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
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常.但是,当我改变这样的代码

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

然后我得到了例外

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

为什么我得到这个例外?流程应该是我理解的,当我的页面遇到#{helloBasit.label}然后我的构造函数调用,实例变量初始化,将bean实例注入basitBean,然后bean方法应该调用.但是在这种情况下,我在bean实例中得到null为什么?为什么以前的代码有效,但事实并非如此?我怎样才能从构造函数中调用bean?

谢谢.

Dan*_*iel 7

尝试将构造函数的内容移动到post构造函数中......

像这样

@PostConstruct
private void init() {
    System.out.println();
    String label = basitBean.helloBasit();
    System.out.println(label);
}
Run Code Online (Sandbox Code Playgroud)

因为只有在启动托管bean之后才应该注入ejb bean

@PostConstruct构造后正在运行(托管bean本身是由JSF创建后),然后才将EJB被注入到bean和可访问...