2012-04-16 3 views
1

У меня возник вопрос о новой спецификации CDI JEE6, в частности, использование @Inject в сочетании с аннотациями @Named, которые, похоже, заменили специфический jsf @ManagedBean (для ресурса реестра) и @ManagedProperty (для инъекций) аннотации.получить управляемый компонент @Named из области сеанса

Предполагая, что у вас есть класс боба «User» аннотированный @ManagedBean @SessionScoped и объект этого класса вводится в любом компоненте, используя @ManagedProperty тогда, когда создается этот объект и впрыскивается он также положить в сессии, и я мог бы получить доступ к сессии (для например, в фильтре) и получить объект с помощью:

User user = (User)((HttpServletRequest) request).getSession().getAttribute("user"); 

Так что, если я пытаюсь ту же логику (в GlassFish 3.1.2) с использованием @Named @SessionScoped, а затем @Inject я могу подтвердить, что нет такого объекта типа User в сессии, но это то, что я нахожу в сессии:

 
attribute_name: org.jboss.weld.context.conversation.ConversationIdGenerator  
attribute_value: [email protected]765 

attribute_name: org.jboss.weld.context.ConversationContext.conversations    
attribute_value: {} 

где я делаю неправильно ?!

ответ

0

Если вы комментируете компонент с @SessionScoped, вы в основном привязываете его жизненный цикл к HttpSession. Это не означает, что компонент физически вводится в объект сеанса.

Предполагая, что у вас есть боба класса «User» аннотированный @ManagedBean @SessionScoped и объект этого класса вводится в любом компоненте с помощью @ManagedProperty тогда, когда этот объект будет создан и введен он также положить в сессии и я мог бы получить доступ к сессии (например, в фильтре) и получить объект с помощью:

Очень важно: не смешивать JSF и CDI аннотаций. Сделайте все бобы, которые вы хотите получить из шаблона JSF @Named, и используйте CDI @Inject и @...Scoped, этого достаточно.

Чтобы ответить на ваш вопрос:

@SessionScoped 
public class User { ... } 


@RequestScoped 
public class SomeController { 

@Inject 
User user 

... 
} 

Это создаст User, когда сессия начинается и впрыснуть его в SomeControllerSomeController при создании экземпляра (с новым запросом, в данном примере).

Посмотрите на Weld documentation, чтобы получить более полное начало с этой темой ...

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