如何在Weld中将Jersey bean注入Quartz作业?

时间:2012-05-22 08:36:14

标签: java dependency-injection jersey quartz-scheduler jboss-weld

我在Glassfish和jetty-servlet中都有一个纯粹的JAX-RS应用程序。我正在尝试将一些bean注入Quartz作业。

我用@javax.inject.Inject注释了工作字段,但我也相信我需要将工作工厂提供给容器,反之亦然 - 我有点迷失在这里,最后开始。

我如何完成它?

1 个答案:

答案 0 :(得分:0)

你好维克多没有关于你的应用程序的更多细节我将假设你在servlet容器中运行。使用“纯粹的”JAX-RS应用程序无法做到这一点。

但是我建议您使用CDI(Weld或OpenWebBeans)。然后,您可以使用Deltaspike在Quartz作业中启用请求上下文,获取对请求范围bean的引用。

在servlet容器中启用Weld非常simple

有关在HTTP请求之外启用请求上下文的指南here

默认情况下,您不能将@RequestScoped bean注入您的quartz作业(没有HTTP请求,因此没有请求上下文)。要解决这个问题,您可以通过以下链接启用请求上下文或者(可能是我的方法)将@Dependent范围bean(执行工作)注入您的JAX RS bean(基本上是包装器),然后您可以轻松获取引用到你的石英工作中的@Dependent范围bean。

这是我的web.xmlpom.xml用于在码头内运行Weld和Jersey,你需要jetty-plus,jetty-jndi和Weld依赖。

以下是关于在jetty中设置JNDI的一些info,但我不使用此方法,因为我在SE应用程序中启动jetty作为嵌入式容器,这是我所做的代码片段:

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());