2013-01-22 201 views
0

我已經擁有一個String屬性託管bean稱爲用戶名爲名稱:JSF Bean屬性初始化

public class User { 
    private String name; 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
} 

我有一個名爲的UserManager另一個託管bean具有類型用戶的屬性,並允許您添加用戶用戶列表:

public class UserManager { 
    private List<User> userList = new ArrayList<User>(); 
    private User user; 
    public User getUser() { 
     return this.user; 
    } 
    public void setUser(User user) { 
     this.user = user; 
    } 
    public String addUser() { 
     userList.add(user); 
     return "_USERADDED"; 
    } 
} 

我的JSF頁面添加用戶如下所示:

<h:form> 
    <h:inputText value="#{userManager.user.name}"/> 
    <h:commandButton value="Add User" action="#{userManager.addUser}"/> 
</h:form> 

我遇到的問題是當我運行我的頁面並單擊「添加用戶」按鈕時出現以下錯誤:

adduser.xhtml @ 11,50 value =「#{userManager.user.name}」 :目標不可達,「空」因事實的UserManager的用戶屬性爲null,我試圖訪問它來設置屬性返回null

我假設這個錯誤。

我能得到這個工作,如果我改變的UserManager並初始化用戶屬性:

private User user = new User(); 

我的問題是,這是初始化屬性的正確方式或我能做到這一點從JSF文件中和/或配置文件?

+1

首先,最好添加託管bean的範圍:'@ RequestScoped','@ ViewScoped'等等。第二,您不能只將託管bean的引用添加到另一個託管bean ,他們是類,但你不管理他們的創建,JSF容器會。最好的選擇是首先定義你的實體,然後在託管的bean中使用它們。經驗法則:商業實體!= JSF(或CDI)託管bean。 –

回答

3

是的,你應該自己創建它。 JSF/EL不會自動創建嵌套屬性。規範的方法是使用@PostConstruct這個。

@ManagedBean 
@RequestScoped 
public class UserManager { 

    private List<User> userList = new ArrayList<User>(); 
    private User user; 

    @PostConstruct 
    public void init() { 
     user = new User(); 
    } 

    public String addUser() { 
     userList.add(user); 
     return "_USERADDED"; 
    } 

    public User getUser() { 
     return user; 
    } 

} 

請注意,我省略了setter,因爲它從未被JSF/EL使用過。我仍然想知道userList在那裏做什麼,它不屬於那裏。我會假設它只是測試的一個存根。在這種情況下,它可能最好是由@ManagedProperty注入的應用程序或會話範圍的bean。