Доступ к данным сеансового компонента в конструкторе управляемого компонента JSF

Я пытаюсь получить доступ к данным сеансового компонента в конструкторе управляемого компонента. Для этой цели я использую аннотацию @ManagedProperty, как показано ниже. Когда я пытаюсь получить доступ в конструкторе, он дает java.lang.NullPointerException, и тот же фрагмент кода доступен в другой функции. Может быть, мне нужно сделать что-то другое для конструктора. Может кто-нибудь, пожалуйста, направьте меня, что мне нужно сделать.

@ManagedProperty(value="#{sessionBean}")
private SelectCriteriaBean sessionData; 

// This is contructor
public ModifyBusinessProcessBean() {
  logger.debug(getSessionData().getSelectedBusinessProcessLevelZero());     
}

// Another Function where the same code doesn't give error
public anotherFunction() {
  logger.debug(getSessionData().getSelectedBusinessProcessLevelZero());     
}

person SXV    schedule 15.03.2013    source источник


Ответы (2)


Вы не должны использовать @ManagedProperty внутри конструктора, поскольку он еще не установлен. При создании управляемого компонента сначала вызывается его конструктор, а затем с помощью сеттеров задаются управляемые свойства. Вы должны использовать метод, аннотированный @PostConstruct, так как он вызывается после установки свойств:

@PostConstruct
public void init() {
  logger.debug(getSessionData().getSelectedBusinessProcessLevelZero());
}
person partlov    schedule 15.03.2013
comment
Ха! Параллельность в действии :) - person skuntsel; 15.03.2013

Это ожидаемое поведение.

Метод @PostConstruct выполняется сразу после создания компонента и внедрения зависимостей, таких как @ManagedProperty. Таким образом, ваши зависимости просто не будут доступны в конструкторе.

То, что вам нужно сделать, чтобы аннотировать метод с помощью @PostConstruct и ссылаться на ваши зависимости, является стандартным способом:

@PostConstruct
public void init() {
    injectedDependency.performOperation();
}
person skuntsel    schedule 15.03.2013