JSF inyección de EJB en frijoles gestionados

Tengo un EJB (PersonManager) en el módulo de la Aplicación Empresarial, que inyecta otro EJB (Persona):

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

Quiero usar PersonManager EJB en una aplicación web JSF. Lo defino en faces-config.xml:

  personManager ejb.PersonManager session  

El problema es que la inyección de PersonLocal EJB no ocurre. La propiedad de la persona siempre es NULL. ¿Qué hice mal?

Pero si inyecto el PersonManager en un bean gestionado JSF como este:

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

FUNCIONA. Necesito el primer escenario, ayúdenme por favor 😀

Está mezclando las responsabilidades de los EJB y los beans gestionados de JSF. El faces-config.xml registra solo los artefactos JSF, como los beans administrados y no los EJB. Su registro en faces-config.xml

  personManager ejb.PersonManager session  

básicamente hace exactamente lo mismo que

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

En otras palabras, está registrando la clase como un bean gestionado JSF que está disponible en vistas por #{personManager} . Esto no representa la misma instancia que administra el contenedor EJB. Puede y no debe usar faces-config.xml para registrar EJB. Allí utiliza las anotaciones del paquete javax.ejb para, como @Stateless y @Stateful . Eso es todo lo que necesita para registrar un EJB.

De hecho, el registro de los beans administrados por JSF en faces-config.xml es una antigua forma de JSF 1.x que en JSF 2.x ha sido reemplazada por la nueva anotación @ManagedBean .


Actualizar el enfoque adecuado sería:

Ver (el archivo Facelets):

   ...    

Controlador (el bean gestionado JSF):

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

Modelo (la entidad JPA):

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

Servicio (el EJB sin estado):

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