JSF管理的bean EJB注入

JSF管理的bean EJB注入,jsf,ejb,managed-bean,Jsf,Ejb,Managed Bean,我在企业应用程序模块中有一个EJB(PersonManager),它注入另一个EJB(Person): 我想在JSF web应用程序中使用PersonManager EJB。我在faces-config.xml中定义它: <managed-bean> <managed-bean-name>personManager</managed-bean-name> <managed-bean-class>ejb.PersonManager&l

我在企业应用程序模块中有一个EJB(PersonManager),它注入另一个EJB(Person):

我想在JSF web应用程序中使用PersonManager EJB。我在faces-config.xml中定义它:

<managed-bean>
    <managed-bean-name>personManager</managed-bean-name>
    <managed-bean-class>ejb.PersonManager</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

它起作用了。我需要第一个场景,请帮助我:-D

您正在混合EJB和JSF托管bean的职责。
faces config.xml
只注册JSF工件,比如托管bean,而不是EJB。您在
faces config.xml中的注册

<managed-bean>
    <managed-bean-name>personManager</managed-bean-name>
    <managed-bean-class>ejb.PersonManager</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>
换句话说,您正在将该类注册为JSF托管bean,该bean在
{personManager}
的视图中可用。这与EJB容器管理的实例不同。您可以而且不应该使用
faces config.xml
来注册EJB。在这里,您可以使用来自
javax.ejb
包的注释,例如
@Stateless
@Stateful
。这就是注册EJB所需的全部内容

实际上,在
faces config.xml
中注册JSF托管bean是一种旧的JSF 1.x方式,在JSF 2.x中已被新的
@ManagedBean
注释所取代


更新正确的方法是:

查看(Facelets文件):

模型(JPA实体):

服务(无状态EJB):


为什么不使用@EJB注释而不是在faces config.xml中手动声明它呢??这就像试图回到过去,但注释还没有发明:你是对的:-D这只是理论上的,我想知道答案。@40那么为什么它不起作用呢?答案我不清楚。谢谢,PersonManager是一个业务EJB,因此不包含@ManagedBean注释。它是由JSF引擎创建的,只是没有在faces配置场景下将person EJB注入其中。你…吗?究竟哪一部分现在还不清楚?请注意,我的回答示例中缺少了
@Stateful
。这种方式不是EJB。您试图滥用EJB作为JSF管理的bean。这是不对的。基本上应该有1个XHTML文件作为视图,1个JSF托管bean作为控制器,1个实体作为模型,1个EJB作为服务。在您的问题中,
PersonManager
应该是JSF管理的bean,而不是EJB。
PersonLocal
似乎太像一个实体,而不是EJB。所以我怀疑它是否真的需要一个EJB。EJB旨在提供诸如
create()
save()
等服务。有关启动示例,请参见更新的答案。请注意,您根本不需要配置xml文件。我正在阅读答案,同时我也很欣赏作者,但当我讲到最后时,看到底部是您的名字“BalacC”,我的兴奋降低了。难怪只有你才能写出这么好的答案。祝你好运
@ManagedBean
@RequestScoped
public class Index {
    @EJB
    private PersonManagerLocal personManager;
    ....
<managed-bean>
    <managed-bean-name>personManager</managed-bean-name>
    <managed-bean-class>ejb.PersonManager</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>
@ManagedBean
@SessionScoped
public class PersonManager {
    // ...
}
<h:form>
    <h:inputText value="#{personManager.person.name}" />
    ...
    <h:commandButton value="Save" action="#{personManager.save}" />
    <h:messages />
</h:form>
@ManagedBean
@ViewScoped
public class PersonManager implements Serializable {

    private Person person;

    @EJB
    private PersonService personService;

    @PostConstruct
    public void init() {
        person = new Person();
    }

    public void save() {
        personService.create(person);
        FacesContext.getCurrentInstance().addMessage(null,
            new FacesMessage("Person successfully created, new ID is " + person.getId()));
    }

    // ...
}
@Entity
public class Person implements Serializable {

    @Id
    private Long id;

    private String name;

    // ...
}
@Stateless
public class PersonService {

    @PersistenceContext
    private EntityManager em;

    public void create(Person person) {
        em.persist(person);
    }

    // ...
}