2013-11-17 3 views
3

Когда я определяю свой управляемый bean-компонент как CDI-компонент (@Named), он не отображается всплывающим окном ui: debug. Если я изменю определение на JSF @ManagedBean, он будет отображаться в переменных с областью видимости просто отлично. Есть ли что-нибудь дополнительное, что мне нужно сделать, чтобы сделать эту работу? Я использую Mojarra 2.1.JSF <ui:debug> не отображается CDI beans

+0

Вы тоже это придаете? Вы переключаете свои области JSF для областей CDI при переключении с '@ ManagedBean' на' @ Named'? –

+0

Да, оба являются SessionScoped (в javax.faces.bean и javax.enterprise.context соответственно) – Catweazle

ответ

4

Управляемые биты CDI не сохраняются в качестве прямых атрибутов области запроса/сеанса/приложения. Они абстрагируются от контекста CDI, для которого он в свою очередь зависит от реализации (например, Weld vs OpenWebBeans vs others), как именно они упоминаются в области. <ui:debug> не предлагает встроенных средств для отображения активных управляемых бинов CDI (пока?).

Ваш лучший выбор - получить их вручную. Вы можете использовать следующий метод полезности для этого (который будет доступен в предстоящем OmniFaces 1.7 в Beans служебный класс):

public static Map<Object, String> getActiveReferences(BeanManager beanManager, Class<? extends Annotation> scope) { 
    Map<Object, String> activeReferences = new HashMap<Object, String>(); 
    Set<Bean<?>> beans = beanManager.getBeans(Object.class); 
    Context context = beanManager.getContext(scope); 

    for (Bean<?> bean : beans) { 
     Object reference = context.get(bean); 

     if (reference != null) { 
      activeReferences.put(reference, bean.getName()); 
     } 
    } 

    return Collections.unmodifiableMap(activeReferences); 
} 

Вот как вы можете использовать его:

@Inject 
private BeanManager manager; 

public void collect() { 
    Map<Object, String> requestScopedBeans = Beans.getActiveReferences(manager, RequestScoped.class); 
    // Map key represents the instance and map value represents the managed bean name, if any. 

    // ... 
} 

Имейте в виду, что это относительно дорогостоящая работа. Так что действительно используйте его только для отладки.

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