2015-04-27 4 views
0

Iam пытается получить объект моего SessionScoped managedBean из класса ManagedBeanUtil, но все iam получают значение null.Доступ к классу @SessionScoped @ManagedBean в ExternalContext # getSessionMap() возвращает null

вот мой код: -

package com.beas.ui.manager; 
@ManagedBean(name = "sessionManager") 
@SessionScoped 
public class SessionManager implements Serializable { 
private static final long serialVersionUID = -3064514740080155761L; 

//.. 
} 

public class ManagedBeanUtil { 

public static SessionManager getSessionManager() { 

    return (SessionManager) FacesContext.getCurrentInstance() 
      .getExternalContext().getSessionMap().get("sessionManager"); // returns null 
} 
} 

я не ни на что IAM делать неправильно. может ли кто-нибудь дать подходящее решение для этого?

+1

почему вы хотите получить доступ к компоненту таким образом, вместо инъекции? – erencan

+0

что-то не так с тем, как я получаю доступ к sessionManager @erencan. – Subodh

ответ

5

Когда вы получаете доступ к этому «сырым» способом, он вернет null, когда JSF еще не создал (авто) компонент.

Если вы хотите, чтобы убедиться, что JSF автоматически создает компонент, то вы должны быть доступ к нему, оценивая его как выражение Е.Л. через среди других Application#evaluateExpressionGet():

public static SessionManager getSessionManager() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    return (SessionManager) context.getApplication().evaluateExpressionGet(context, "#{sessionManager}", SessionManager.class); 
} 

Однако, канонический (и более декларативный) путь заключается в том, чтобы вводить его как @ManagedProperty в целевой компонент (который делает под обложками в основном то же, что и выше).

@ManagedBean 
@RequestScoped 
public class SomeBean { 

    @ManagedProperty("#{sessionManager}") 
    private SessionManager sessionManager; // +setter 
} 

CDI @Named + @Inject делает его более чистым, не требуя сеттер и аннотаций значение.

@Named 
@RequestScoped 
public class SomeBean { 

    @Inject 
    private SessionManager sessionManager; 
} 
@Named 
@SessionScoped 
public class SessionManager implements Serializable { 

} 
+0

Извините за ответ так поздно, но управляемый beanManager sessionManager объявлен в области сеанса. Таким образом, мы можем получить доступ к managedBean с помощью метода getSessionMap(). И это действительно работает для меня, но не в этот раз :( – Subodh

+0

Хм? Вы прочитали и поняли ответ? Первое предложение уже объясняет, когда оно вернет «нуль». И после этого ответ показывает, как вы можете его получить в любом случае. вы хотели ответить на комментарий кого-то еще? – BalusC

+0

да, читайте свой ответ, но я беспокоюсь, почему bean еще не создан, но он должен быть. Что не так с использованием getSessionMap(). – Subodh