【问题标题】:JSF Bean Property InitializationJSF Bean 属性初始化
【发布时间】: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


【解决方案1】:

是的,您应该自己创建它。 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。

【讨论】:

    猜你喜欢
    • 2015-05-07
    • 2014-06-21
    • 2013-03-24
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 2013-02-06
    • 2010-09-23
    • 2016-07-22
    相关资源
    最近更新 更多