JSF managed-bean EJB injection

后端 未结 1 649
青春惊慌失措
青春惊慌失措 2020-11-27 12:45

I have an EJB (PersonManager) in the Enterprise Application modul, which injects another EJB (Person):

@Stateful
public class PersonManager implements Person         


        
相关标签:
1条回答
  • 2020-11-27 13:03

    You are mixing the responsibilities of EJBs and JSF managed beans. The faces-config.xml registers only JSF artifacts, such as managed beans and not EJBs. Your registration in 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>
    

    does basically exactly the same as

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

    In other words, you're registering the class as a JSF managed bean which is available in views by #{personManager}. This does not represent the same instance as is managed by the EJB container. You can and should not use faces-config.xml to register EJBs. There you use the annotations from the javax.ejb package for, such as @Stateless and @Stateful. That's all you need to register an EJB.

    Actually, registering JSF managed beans in faces-config.xml is an old JSF 1.x way which has in JSF 2.x been replaced by the new @ManagedBean annotation.


    Update the proper approach would be:

    View (the Facelets file):

    <h:form>
        <h:inputText value="#{personManager.person.name}" />
        ...
        <h:commandButton value="Save" action="#{personManager.save}" />
        <h:messages />
    </h:form>
    

    Controller (the JSF managed 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 (the JPA entity):

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

    Service (the stateless EJB):

    @Stateless
    public class PersonService {
    
        @PersistenceContext
        private EntityManager em;
    
        public void create(Person person) {
            em.persist(person);
        }
    
        // ...
    }
    
    0 讨论(0)
提交回复
热议问题