Как добавить джерсейские бобы в работу Quartz в Weld?

У меня есть чистое приложение JAX-RS как в Glassfish, так и в причале-сервлете. Я пытаюсь ввести некоторые бобы в работу Quartz.

Я аннотировал поля Job с помощью @javax.inject.Inject, но я также считаю, что мне нужно сделать фабрику заданий доступной для контейнера или наоборот - я несколько потерял здесь, с чего начать.

Как мне это сделать?


person Victor Sergienko    schedule 22.05.2012    source источник
comment
Виктор, вы хотите @Inject job в другие ваши bean-компоненты?   -  person Justin    schedule 22.05.2012
comment
Нет, наоборот. Мне в основном нужен регистратор и DAO на работе.   -  person Victor Sergienko    schedule 22.05.2012


Ответы (1)


Привет, Виктор, без каких-либо подробностей о вашем приложении. Я предполагаю, что вы работаете в контейнере сервлетов. Невозможно сделать это с помощью «чистого» приложения JAX-RS.

Однако я бы рекомендовал вам использовать CDI (Weld или OpenWebBeans). Затем вы можете использовать Deltaspike, чтобы включить контекст запроса внутри вашего задания Quartz, чтобы получить ссылку на bean-компонент с областью запроса.

Включение Weld в контейнере сервлета довольно просто

Руководство по включению контекста запроса вне HTTP-запроса доступно здесь

По умолчанию вы не можете внедрить bean-компоненты @RequestScoped в свою кварцевую работу (нет HTTP-запроса, следовательно, нет контекста запроса). Чтобы обойти это, вы можете либо включить контекст запроса, перейдя по ссылке выше, ИЛИ (и, возможно, мой подход) внедрить компоненты @Dependent с областью видимости (которые выполняют работу) в ваши компоненты JAX RS (по сути, обертки), затем вы можете легко получить ссылки к @Dependent bean-компонентам внутри вашего кварцевого задания.

Вот мой web.xml и pom.xml для запуска Weld и Jersey внутри причала вам потребуются зависимости jetty-plus, jetty-jndi и Weld.

Вот некоторая информация о настройке JNDI в причале, однако я не использую этот метод, поскольку Я запускаю причал как встроенный контейнер в приложении SE, вот фрагмент кода того, что я делаю:

String[] configurationClasses =
{
    "org.eclipse.jetty.webapp.WebInfConfiguration",
    "org.eclipse.jetty.webapp.WebXmlConfiguration",
    "org.eclipse.jetty.webapp.MetaInfConfiguration",
    "org.eclipse.jetty.webapp.FragmentConfiguration",
    "org.eclipse.jetty.plus.webapp.EnvConfiguration",
    "org.eclipse.jetty.webapp.JettyWebXmlConfiguration"
};
WebAppContext webapp = new WebAppContext();
webapp.setConfigurationClasses(configurationClasses);
webapp.setDescriptor("/path/to/webapp/WEB-INF/web.xml");
webapp.setContextPath("/");
webapp.setResourceBase("/path/to/webapp");
webapp.setClassLoader(Thread.currentThread().getContextClassLoader());
person Justin    schedule 22.05.2012
comment
Извините за дикую неконкретность. Я использую Weld, кажется, в jetty-servlet. Обновление вопроса сейчас. - person Victor Sergienko; 22.05.2012
comment
Не могли бы вы также поделиться своим pom.xml? - person Victor Sergienko; 22.05.2012
comment
Спасибо. Очень похожая конфигурация не запускается у меня с: IllegalStateException: Nothing to bind for name javax.enterprise.inject.spi.BeanManager/default at org.eclipse.jetty.plus.webapp.PlusDescriptorProcessor.bindEntry(PlusDescriptorProcessor.java:890). Не могли бы вы помочь мне, почему? - person Victor Sergienko; 23.05.2012
comment
@VictorSergienko Я включил то, что я делаю, чтобы включить jndi в пристани, я хотел написать в блог о том, как получить джерси, сварку, jsf2 и пристань, все хорошо работает из приложения j2se, поэтому я постараюсь сделать это на выходных и буду также прикрепите пример проекта на github. - person Justin; 24.05.2012
comment
Еще раз спасибо за DeltaSpike, это основная часть, которую мне не хватало. К сожалению, у меня не было возможности создать Context самостоятельно. - person Victor Sergienko; 24.05.2012
comment
могу я также попросить вас взглянуть на мой новый вопрос, заголовок stackoverflow.com/questions/11127665/ - person Victor Sergienko; 21.06.2012