Ответ 1
Вы смешиваете обязанности управляемых EJB и JSF beans. faces-config.xml
регистрирует только артефакты JSF, такие как управляемые beans, а не 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.
Собственно, регистрация управляемого JSF beans в faces-config.xml
- это старый 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>
Контроллер (управляемый 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;
// ...
}
Служба (EAGE) без сохранения:
@Stateless
public class PersonService {
@PersistenceContext
private EntityManager em;
public void create(Person person) {
em.persist(person);
}
// ...
}