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