2010-10-16 4 views
1

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

@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

Я не знаю, что это такое @Named вещь делает там, но это не нормально, что bean-объект построен каждый раз, когда к нему обращается выражение значения. Он должен быть создан только один раз в начале 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(); 
} 
+0

Это потому, что мой NetBeans автоматически сделал, что @Named когда я делаю я новые ManagedBean. Я просто не замечаю этих вещей :) – AnAmuser

Смежные вопросы