0

我有一个名为 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 并且我试图访问它来设置属性名称

如果我修改 UserManager 并初始化用户属性,我可以让它工作:

private User user = new User();

我的问题是,这是初始化属性的正确方法,还是可以从 JSF 文件和/或配置文件中进行?

4

1 回答 1

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在做什么,它不属于那里。我假设它只是一个用于测试的存根。在这种情况下,它可能最好是您注入的应用程序或会话范围的 bean @ManagedProperty

于 2013-01-23T12:22:37.640 回答