Внешние фильтры и сервлеты для инъекций CDI в контейнере Servlet 3.0 - PullRequest
0 голосов
/ 20 августа 2011

Я наконец решил взглянуть на Weld в Tomcat. При развертывании приложения я вижу в журнале:

«Обнаружен Tomcat 7, инъекция CDI будет доступна в сервлетах и ​​фильтрах»

Как, например, создать экземпляр компонента с помощью BeanManager вне Filter / Servlet?

У меня есть боб:

@javax.inject.Named(value="CarService")
@javax.enterprise.context.RequestScoped
public class CarService implements Serializable{
.
.
.

и я хочу создать его экземпляр, используя BeanManager для указанного контекста запроса.

Context ctx = new InitialContext();
BeanManager manager = (BeanManager) ctx.lookup("java:comp/env/BeanManager");
// NOW WHAT?

Если это можно сделать в сервлете / фильтре, я уверен, что это можно сделать где-нибудь еще, но я просто не хочу проходить через код сварного шва и разбираться с ним самостоятельно, не спрашивая сначала.

Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 21 августа 2011

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

public static <T> T getContextualInstance(final BeanManager manager, final Class<T> type) {
        T result = null;
        Bean<T> bean = (Bean<T>) manager.resolve(manager.getBeans(type));
        if (bean != null) {
            CreationalContext<T> context = manager.createCreationalContext(bean);
            if (context != null) {
                result = (T) manager.getReference(bean, type, context);
            }
        }
        return result;
    }
2 голосов
/ 21 августа 2011

Использование BeanManager - это то, что вы должны делать редко. Смысл в том, чтобы использовать @Inject в местах, где вам нужны зависимости (то есть внедрение зависимостей). Использование менеджера - это шаблон «сервис-локатор».

Если вам это действительно нужно, используйте manager.getBeans(yourDesiredClass), затем выберите один из набора и позвоните manager.getReference(bean, theClass, ctx). ctx будет получено manager.createCreationalContext(bean)

...