JSF Bean属性初始化

时间:2013-01-22 21:51:22

标签: jsf properties init managed-bean

我有一个名为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文件和/或配置文件中执行此操作?

1 个答案:

答案 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。