我在企业应用程序模块中有一个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。我错了什么?
但是如果我在这样的JSF托管bean中注入PersonManager:
@ManagedBean
@RequestScoped
public class Index {
@EJB
private PersonManagerLocal personManager;
....
IT工作。我需要第一个场景,请帮助我:-D
答案 0 :(得分:40)
您正在混合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>
基本上与
完全相同@ManagedBean
@SessionScoped
public class PersonManager {
// ...
}
换句话说,您将该类注册为JSF托管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文件):
<h:form>
<h:inputText value="#{personManager.person.name}" />
...
<h:commandButton value="Save" action="#{personManager.save}" />
<h:messages />
</h:form>
Controller(JSF托管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()));
}
// ...
}
模型(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);
}
// ...
}