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

标签 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.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/

相关文章:

java - EJB 3.1 - 在 EJB 中使用 @EJB - 可能吗?

java - 使用集群在 JBoss 上调度任务

java - 在我的 Seam 项目中使用 EJB3 可以获得哪些提升?

java - EJB 3 注入(inject) spring bean

java - @FacesConverter 阻止 p :selectOneMenu and p:ajax 的方法调用

jsf - 直接传递输入值作为操作方法参数

jsf - 如何有条件地为表格单元格中的背景着色?

transactions - EJB (3.1) 容器内 iBATIS 3 中的事务管理

java - Primefaces <p :dataTable> roweditlistener is not an valid argument

tomcat - JSF 和 Tomcat 可能的内存泄漏