Когда и где объекты создаются в веб-приложении Java EE? - PullRequest
2 голосов
/ 11 декабря 2011

Когда или где создаются объекты?
Они создаются, когда страница XHTML загружается и получает доступ к объектам через управляемый компонент?
Или они автоматически создаются в управляемом компоненте?
Есть линам нужно вручную создать его из конструктора управляемого компонента?

Пожалуйста, смотрите код ниже (возможно, некоторый необходимый код не был скопирован.)

Объект будет:

public class PersonalInfo implements Serializable {
    @Size(max = 50)
    @Column(name = "FIRST_NAME", length = 50)
    private String firstName;

    // some getters and setters
}

веб-страница будет иметь вид:

<h:form>
    <h:outputText value="first name"/> 
    <h:inputText value="#{personalInforController.personalInfo.firstName}" />

    <h:commandButton value="hit me" 
        action="#{personalInforController.create}" 
        immediate="true"/>
</h:form>

, а компонент поддержки будет:

@Named(value = "personalInfoController")
@SessionScoped
public class PersonalInforController {
    @EJB
    PersonalInfoFacade ejbFacade;
    PersonalInfo personalInfo;
    String defaultPage = "index";

    public String create() {
        try {
            ejbFacade.create(personalInfo);
            return "prepareCreate";
        } catch (Exception e) {
            return "success";
        }
    }
}

1 Ответ

4 голосов
/ 11 декабря 2011

В приведенном примере кода действие 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.

...