JSF托pipebean的EJB注入

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

@Stateful public class PersonManager implements PersonManagerLocal { @EJB private PersonLocal person; @Override public void setPersonName(String name) { person.setName(name); } @Override public String getPersonName() { return person.getName(); } } 

我想在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> 

问题是,PersonLocal EJB的注入不会发生。 person属性始终为NULL。 我错了什么?

但是,如果我把这个PersonManager注入一个JSF托pipebean,如下所示:

 @ManagedBean @RequestScoped public class Index { @EJB private PersonManagerLocal personManager; .... 

有用。 我需要第一个场景,请帮助我:-D

您正在混合EJB和JSF托pipe的bean的职责。 faces-config.xml只注册JSF工件,比如托pipe的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> 

基本上完全一样

 @ManagedBean @SessionScoped public class PersonManager { // ... } 

换句话说,您将该类注册为一个JSF托pipebean,该视图通过#{personManager}在视图中提供。 这并不代表EJB容器pipe理的实例。 您可以也不应该使用faces-config.xml来注册EJB。 在那里使用javax.ejb包中的注释,比如@Stateless@Stateful 。 这就是你需要注册一个EJB的全部内容。

实际上,在faces-config.xml注册JSF托pipe的bean是一种旧的JSF 1.x方法,它在JSF 2.x中被新的@ManagedBean注解所取代。


更新适当的方法将是:

查看(Facelets文件):

 <h:form> <h:inputText value="#{personManager.person.name}" /> ... <h:commandButton value="Save" action="#{personManager.save}" /> <h:messages /> </h:form> 

控制器(JSFpipe理的bean):

 @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())); } // ... } 

Model(JPA实体):

 @Entity public class Person implements Serializable { @Id private Long id; private String name; // ... } 

服务(无状态EJB):

 @Stateless public class PersonService { @PersistenceContext private EntityManager em; public void create(Person person) { em.persist(person); } // ... }