Краткая история: У меня есть CDI @SessionScoped
боб (аннотацию из javax.enterprise.context
и не из javax.faces
) называется UserContextBean
. Я бы хотел сделать что-то, когда будет создан сеанс HTTP.PostConstruct в КДИ SessionScoped удалось фасоль
Так что, естественно, я предположил, что @PostConstruct
выполнит трюк: вызывается только один раз, когда создается экземпляр этого компонента. Однако, согласно документации here, они говорят, что метод PostConstruct называется:
Когда управляемый компонент вводится в компонент, CDI вызывает метод после того, как все инъекции произошло, и после того, как все инициализаторах имеют были вызваны.
Я предположил, что метод post post будет вызываться один раз за сеанс. Однако практика согласуется с документацией. Этот компонент вставляется в фасоль @RequestScoped
(также CDI), который служит в качестве поддерживающего компонента для страницы JSF, а метод PostConstruct называется для каждого запроса.
Я понимаю (сейчас), что это поведение. Но будет ли какой-либо другой способ сделать один раз за каждую инициализацию сеанса?
Некоторый код, хотя и не очень актуальна:
@Named(UserContextBean.BEAN_NAME)
@SessionScoped
public class UserContextBean implements Serializable {
...
@PostConstruct
private void createSession() {
System.out.println("UserContext created.");
}
}
Запрос области видимости боб, где я впрыснуть это:
public abstract class WebPageDataProvider extends AbstractViewDataProvider {
@Inject
private UserContextBean userContext;
Я также думал использовать HttpSessionListener
и инициализировать компонент сеанса, но это уже кажется грязным.
EDIT
Просто заметил теперь, что HTTP сессии даже не создана. Если я создаю сеанс «вручную», вызывая getSession(true)
(я делаю это внутри фазового прослушивателя, для тестирования, но только потому, что он уже был там), тогда все работает так, как ожидалось.
Как создается ваш пользовательский интерфейс? –
@JohnAment: Ну, это JSF 2 (Mojarra). Конкретная страница, которую я тестирую, очень проста. Это происходит из шаблона и просто объединяет пару человечков. Выражение EL, которое использует объект с привязкой к запросу, находится на фактической странице, а не в масках, и просто обращается к текстовому свойству в компоненте (который использует компонент контекста пользователя для получения роли пользователя). –
Хорошо, хорошо. Извините, как насчет реализации CDI и контейнера? Если вы используете tomcat, используете ли вы CDI через сервлет? –