【发布时间】:2013-01-06 06:43:30
【问题描述】:
我有一个名为 User 的托管 bean,它有一个名为 name 的 String 属性:
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
我有另一个名为 UserManager 的托管 bean,它具有 User 类型的属性,并允许您将用户添加到用户列表中:
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}":目标无法到达,'null' 返回 null
我假设这个错误是由于 UserManager 中的 user 属性为空,我试图访问它来设置属性 name。 p>
如果我修改 UserManager 并初始化用户属性,我可以让它工作:
private User user = new User();
我的问题是,这是初始化属性的正确方法还是我可以在 JSF 文件和/或配置文件中进行初始化?
【问题讨论】:
-
首先,最好添加托管 bean 的范围:
@RequestScoped、@ViewScoped等。其次,您不能只添加来自托管 bean 的引用bean 到另一个,它们是类,但你不管理它们的创建,JSF 容器会。最好的选择是首先定义您的实体,然后在您的托管 bean 中使用它们。经验法则:业务实体!= JSF(或 CDI)托管 bean。
标签: jsf properties init managed-bean