我正在使用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>

07-25 21:22
查看更多