1

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

我已经用 注释了 Job 字段@javax.inject.Inject,但我也相信我需要让 Job factory 可用于容器,反之亦然 - 我在这里有点迷失了从什么开始。

我该如何完成它?

4

1 回答 1

0

嗨,Victor,没有关于您的应用程序的更多详细信息,我假设您在 servlet 容器中运行。使用“纯”JAX-RS 应用程序无法做到这一点。

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

在 servlet 容器中启用 Weld 非常简单

此处提供了有关在 HTTP 请求之外启用请求上下文的指南

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

这是我的web.xmlpom.xml,用于在 jetty 中运行 Weld 和 Jersey,您将需要 jetty-plus、jetty-jndi 和 Weld 依赖项。

以下是有关在 jetty 中设置 JNDI 的一些信息,但是我不使用此方法,因为我将 jetty 作为 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());
于 2012-05-22T08:46:40.580 回答