2013-05-10 4 views
3

Краткая история: У меня есть 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) (я делаю это внутри фазового прослушивателя, для тестирования, но только потому, что он уже был там), тогда все работает так, как ожидалось.

+0

Как создается ваш пользовательский интерфейс? –

+0

@JohnAment: Ну, это JSF 2 (Mojarra). Конкретная страница, которую я тестирую, очень проста. Это происходит из шаблона и просто объединяет пару человечков. Выражение EL, которое использует объект с привязкой к запросу, находится на фактической странице, а не в масках, и просто обращается к текстовому свойству в компоненте (который использует компонент контекста пользователя для получения роли пользователя). –

+0

Хорошо, хорошо. Извините, как насчет реализации CDI и контейнера? Если вы используете tomcat, используете ли вы CDI через сервлет? –

ответ

0

HttpSessionListener - ваш лучший выбор. Что вы можете сделать, это вставить компонент SessionScoped в слушатель и установить там значение.

Смежные вопросы