Jsf 2 EJB方法未从构造函数调用

Jsf 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

我创建了一个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
为什么我会得到这个例外?这个流程应该是我所理解的,当我的页面遇到
{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

托管Bean

XHTML页面


我希望有帮助

你的想法是正确的,但我发现有些问题可能会解决

  • 如果EJB没有直接实现接口,则不需要使用
    @LocalBean
    注释。在本例中,无论是否使用
    @LocalBean
    注释,都具有相同的效果。不过,如果你想把它说清楚的话,你可以把它留下。看

  • 确保
    @ManagedBean
    @SessionScoped
    javax.faces.bean
    包导入

请参阅此工作示例:

EJB

托管Bean

XHTML页面


我希望有帮助

是的,它正在工作:)所以托管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}" />