JSF托管bean EJB注入

时间:2011-12-24 18:51:48

标签: jsf ejb managed-bean

我在企业应用程序模块中有一个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

1 个答案:

答案 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);
    }

    // ...
}