Ответ 1
Если это управляемый компонент, как вы говорите, вы должны сделать это в методе, аннотированном с @PostConstruct
public class Person {
private List<String> friends;
@PostConstruct
public void init(){
friends = new ArrayList<String>();
}
//getter and setter...
}
-
Практика выполнения любой инициализации в getter и setter обычно не одобряется в контексте JSF. См. Почему JSF вызывает геттеры несколько раз
-
Кроме того, для API для
@PostConstruct
, контракт определяет функции безопасности и гарантирует, что если исключение выбрасывается в методе, аннотированном как таковое, компонент не должен вводиться в действие. Таких гарантий для простого конструктора нет. -
В управляемом компоненте инъекция происходит сразу после строительства. Это означает, что любые операции, которые вы выполняете в конструкторе, не могут зависеть от каких-либо
@ManagedProperty
ресурсов (через@ManagedProperty
). Если в методе@PostConstruct
вас будет доступ ко всем ресурсам, объявленным в управляемом компоненте
EDIT: Это важно отметить, что может быть только один @PostConstruct
для любого @ManagedBean
, поэтому вся важная инициализация должна произойти там.
Также стоит отметить, что, хотя метод @PostConstruct
является идеальным местом для инициализации переменной /List
компонента backing bean, есть последствия в отношении объема управляемого компонента
-
@RequestScoped
: в управляемом компоненте с этой аннотацией метод будет вызван для каждого из представленных JSF-представлений.@RequestScoped
уничтожается и воссоздается с каждым запросом. Следствием этого является то, что в зависимости от вашей установки список, инициализированный в@PostConstruct
может быть сброшен до пустых значений или значений по умолчанию во время каждого запроса. При определенных обстоятельствах ошибки преобразования могут возникать в результате повторной инициализации запроса mid-JSF списка. -
@ViewScoped
: в управляемом компоненте с этой аннотацией вы гарантированно@PostConstruct
метод@PostConstruct
один раз, если и только если вы имеете дело с одним и тем же экземпляром компонента@ViewScoped
. Если обработанный вид бобов уничтожен и воссоздан, метод@PostConstruct
снова запустится. -
@SessionScoped
: компонент с этой аннотацией создается один раз и остается живым до окончания сеанса HTTP пользователя. В этом случае метод@PostConstruct
гарантированно запускается один раз и только один раз, пока бит не будет уничтожен
Смотрите также