JSF свойство не сохранено - PullRequest
       28

JSF свойство не сохранено

1 голос
/ 16 октября 2010

Я не очень понимаю, почему этот простой материал не работает. Я вижу, что установленный конструктор вызывается каждый раз, когда устанавливается одно свойство. Проблема состоит в том, что когда я достигаю метода sendInvitation, тогда все атрибуты InviteEmails равны нулю.

@Named(value = "adminBean")
@RequestScoped
public class AdminBean implements Serializable {

    private String inviteEmail1;
    private String inviteEmail2;
    private String inviteEmail3;
    private BasicUser administrator;
    @EJB
    private MessageBeanRemote messageBean3;

    /** Creates a new instance of AdminBean */
    public AdminBean() {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().
                getExternalContext().getSession(true);
        LoginBean loginBean = (LoginBean) session.getAttribute("loginBean");
        administrator = loginBean.getUser();
    }

    public String getInviteEmail1() {
        return inviteEmail1;
    }

    public void setInviteEmail1(String inviteEmail) {
        this.inviteEmail1 = inviteEmail;
    }

    public String getInviteEmail2() {
        return inviteEmail2;
    }

    public void setInviteEmail2(String inviteEmail) {
        this.inviteEmail2 = inviteEmail;
    }

    public String getInviteEmail3() {
        return inviteEmail3;
    }

    public void setInviteEmail3(String inviteEmail) {
        this.inviteEmail3 = inviteEmail;
    }

    public void sendInvitations() { 
    ...
    }
}

Страница, которая использует этот компонент, является компонентом, который является частью другой страницы:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <ui:component id="adminComp">
        <h3>Adminstration page</h3>
        <h:form id="inviteForm">
            <h:panelGrid columns="1">
                Invite new members to your group. Type in their emails in the fields below.
                <h:inputText id="email1" value="#{adminBean.inviteEmail1}" size="40"/>
                <h:inputText id="email2" value="#{adminBean.inviteEmail2}" size="40"/>
                <h:inputText id="email3" value="#{adminBean.inviteEmail3}" size="40"/>
                <h:commandButton value="invite" action="#{adminBean.sendInvitations}"/>
            </h:panelGrid>
        </h:form>
    </ui:component>


</html>

AdminBean на самом деле инициализируется много раз, и это выглядит странно. «Конструктор» - это конструктор adminBean, «Get 1» - это getInviteEmail1 и т. Д.

INFO: START PHASE RESTORE_VIEW 1
INFO: END PHASE RESTORE_VIEW 1
INFO: START PHASE APPLY_REQUEST_VALUES 2
INFO: END PHASE APPLY_REQUEST_VALUES 2
INFO: START PHASE PROCESS_VALIDATIONS 3
INFO: Constructor
INFO: Constructor
INFO: Constructor
INFO: Constructor
INFO: Constructor
INFO: Constructor
INFO: Get 2
INFO: Constructor
INFO: Constructor
INFO: Constructor
INFO: Get 3
INFO: END PHASE PROCESS_VALIDATIONS 3
INFO: START PHASE UPDATE_MODEL_VALUES 4
INFO: Constructor
INFO: Set 1
INFO: Constructor
INFO: Set 2
INFO: Constructor
INFO: Set 3
INFO: END PHASE UPDATE_MODEL_VALUES 4
INFO: START PHASE INVOKE_APPLICATION 5
INFO: Constructor
SEVERE: NullPointerException....
INFO: END PHASE INVOKE_APPLICATION 5
INFO: START PHASE RENDER_RESPONSE 6
INFO: Constructor
INFO: Constructor
INFO: Get 2
INFO: Constructor
INFO: Get 3
INFO: END PHASE RENDER_RESPONSE 6

Любая помощь ценится.

1 Ответ

1 голос
/ 16 октября 2010

Я не знаю, что там делает эта вещь @Named, но это не нормально, что бин создается каждый раз, когда к нему обращается выражение значения.Он должен быть создан только один раз в начале HTTP-запроса.Возможно, неправильная конфигурация @Named.

Попробуйте просто объявить компонент способом JSF, используя @ManagedBean и убедитесь, что @RequestScoped также из пакета javax.faces.bean.

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean
@RequestScoped
public class AdminBean implements Serializable {
    // ...
}

Кроме этой проблемы, ваш способ получения сессионного компонента не рекомендуется.Обычный способ JSF будет следующим:

@ManagedProperty(value="#{loginBean}")
private LoginBean loginBean;

при необходимости со следующим геттером

public BasicUser getAdministrator() {
    return loginBean.getUser();
}
...