我在Glassfish和jetty-servlet中都有一个纯粹的JAX-RS应用程序。我正在尝试将一些bean注入Quartz作业。
我用@javax.inject.Inject
注释了工作字段,但我也相信我需要将工作工厂提供给容器,反之亦然 - 我有点迷失在这里,最后开始。
我如何完成它?
答案 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.xml和pom.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());