我正在使用JerseyServletContainer机制来部署我的REST Web服务。 web.xml中的配置如下所示:
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
com.myservlet.classes
</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
我想实现的是,在对REST服务的第一个HTTP调用之前,将构造我的REST资源类。
此刻,即使我已经设定
<load-on-startup>0</load-on-startup>
似乎只有在首先对资源进行HTTP请求时,Jersey的ServletContainer才调用实际类的构造函数。
有办法实现吗?
我需要补充一点,此刻,我刚刚添加了一个ServletContextListener,它对自身进行了HTTP调用。但我想避免这种骇人听闻的方式。
任何帮助/建议非常感谢?
编辑:我需要补充一点,我在我的Resource类上使用@Singleton批注,因为在整个应用程序中我只需要一个实例
最佳答案
您可以使用this answer中提到的@Immediate
范围。您应该查看“相关问题”链接。存在一些与即时线程内存泄漏有关的问题。看来问题已解决。因此,您应确保使用最新版本来获取补丁。
链接的答案使用无web.xml的配置。但是,如果要保留web.xml(带有@ApplicationPath
),则可以根据需要在web.xml中声明ResourceConfig
类。
public class JerseyApplication extends ResourceConfig {
@Inject
public JerseyApplication(ServiceLocator locator) {
ServiceLocatorUtilities.enableImmediateScope(locator);
packages("com.myservlet.classes");
}
}
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>org.foo.JerseyApplication</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>