JSF管理的bean EJB注入
我在企业应用程序模块中有一个EJB(PersonManager),它注入另一个EJB(Person): 我想在JSF web应用程序中使用PersonManager EJB。我在faces-config.xml中定义它: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
<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);
}
// ...
}