2010-10-16 107 views
1

我不明白爲什麼這個簡單的東西不會工作。我可以看到,我設置的構造函數是每次調用一個屬性設置的。問題是當我到達sendInvitation方法時,所有的inviteEmails都是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() { 
    ... 
    } 
} 

這是使用這個bean的頁面是一個組件是另一個頁面的一部分:

<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 

任何幫助appriciated。

回答

1

我不知道在那裏做了什麼@Named,但是這種bean每次被值表達式訪問時都被構造是不正常的。它只能在HTTP請求開始時構造一次。可能@Named背後的配置是錯誤的。

嘗試使用@ManagedBean聲明bean的JSF方式,並確保@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; 

如有必要,下面的getter

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

這是因爲我的NetBeans將自動做出@Named當我做我的新ManagedBean。我只是忽略那些東西:) – AnAmuser 2010-10-16 19:05:17