在JSF托管bean中初始化List

Mit*_*ogl 12 jsf arraylist java-ee-6 jsf-2

我有一个关于POJO中List的初始化的问题,因为它遵循下一个代码:

public class Person {

 //other fields...
 private List<String> friends=new ArrayList<>();

     public List<String> getFriends() {
        return friends;
     }
     public void setFriends(List<String> friends) {
        this.friends = friends;
    }

}
Run Code Online (Sandbox Code Playgroud)

或者它是这样的更好,并在其他类中具有初始化(例如Bean(JSF))

public class Person {

 //other fields...
 private List<String> friends;

     public List<String> getFriends() {
        return friends;
     }
     public void setFriends(List<String> friends) {
        this.friends = friends;
    }

}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是什么方法更好?

kol*_*sus 25

如果它是你说的托管bean,你应该在一个带注释的方法中执行此操作 @PostConstruct

public class Person {
    private List<String> friends;
    @PostConstruct
    public void init(){
         friends = new ArrayList<String>();
    }

    //getter and setter...
}
Run Code Online (Sandbox Code Playgroud)
  1. 在getF和setter中进行任何初始化的做法通常在JSF的上下文中不受欢迎.请参阅为什么JSF多次调用getter

  2. 此外,根据API@PostConstruct,合同规定了安全功能,并保证如果在注释方法中抛出异常,则不应该将bean投入使用.普通构造函数没有这样的保证.

  3. 在托管bean中,注入在施工后立即发生.这意味着您在构造函数中执行的任何操作都不能依赖于任何注入的资源(via @ManagedProperty).而在@PostConstruct方法中,您将可以访问托管bean上声明的所有资源

编辑:重要的是要注意,任何一个都只能有一个 ,所以所有重要的初始化都应该在那里发生.@PostConstruct@ManagedBean

值得注意的是,虽然该@PostConstruct方法是初始化支持bean变量/的理想位置List,但是对托管bean的范围有影响.

  1. @RequestScoped:在具有此批注的托管bean中,将根据相关JSF视图的提交调用该方法.@RequestScoped每个请求都会销毁并重新创建一个bean,这意味着根据您的设置,@PostConstruct在每个请求期间,可能会将初始化的列表重置为空值或默认值.在某些情况下,由于JSF中间列表请求的重新初始化,可能会发生转换错误.

  2. @ViewScoped:在具有此批注的托管bean中@PostConstruct,当有并且仅当您处理@ViewScopedbean 的同一实例时,才能保证方法运行一次.如果销毁并重新创建了viewscoped bean,则该@PostConstruct方法将再次运行.

  3. @SessionScoped:具有此批注的bean将创建一次并保持活动状态,直到用户的HTTP会话结束.在这种情况下,该@PostConstruct方法保证只运行一次,直到bean被销毁

也可以看看