我有一个名为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 属性为null并且我尝试访问它以设置属性 name 。
如果我修改UserManager并初始化用户属性,我可以使用它:
private User user = new User();
我的问题是,这是初始化属性的正确方法还是我可以在JSF文件和/或配置文件中执行此操作?
答案 0 :(得分: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。