В приведенном примере кода действие create
действительно не работает. Сущность должна быть создана поддерживающим компонентом до этого.
Если это простая сущность, то будет работать либо конструктор, либо метод @PostConstruct. Например:
@Named(value = "personalInfoController")
@SessionScoped
public class PersonalInforController {
@EJB
PersonalInfoFacade ejbFacade;
PersonalInfo personalInfo;
String defaultPage = "index";
@PostConstruct
public void init() {
personalInfo = new PersonalInfo();
}
public String create() {
try {
ejbFacade.create(personalInfo);
return "prepareCreate";
} catch (Exception e) {
return "success";
}
}
Некоторые заметки о коде. Весьма подозрительно и, скорее всего, совершенно неправильно объявлять ваш бин @SessionScoped. Если personalInfo
редактируется в двух вкладках или окнах, вы окажетесь в мире боли. Я предлагаю сделать ваш компонент @ViewScoped (для CDI есть отдельное расширение, созданное Seam3, которое позволяет это, если вы не можете / не будете использовать это расширение, рассмотрите возможность использования @ManagedBean вместо @Named).
Кроме того, вы можете объявить переменные вашего экземпляра частными и дать ejbFacade
лучшее имя (например, personalInfoFacade). Я также сомневаюсь, нужно ли immediate
в commandButton, и поскольку outputText, очевидно, является меткой для данного inputText, вы можете рассмотреть возможность использования outputLabel и атрибута for.