2015-11-23 45 views
1

我正在使用JerseyServletContainer机制来部署我的REST Web服务。在web.xml的配置类似如下:JerseyServlet在服务器启动时初始化资源

<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> 

好像实际类的构造函数是由新泽西州的名为ServletContainer只有当一个HTTP请求首先到资源制造。

有没有办法做到这一点?

我需要补充一点,此刻我刚刚添加了一个ServletContextListener,它会对自己进行HTTP调用。但我想避免那种拙劣的方式。

任何帮助/建议非常感谢?

编辑:我需要为我需要在整个应用程序

+0

可能这应该会给你更多的想法 - http://stackoverflow.com/questions/28917768/load-on-startup-and- Jersey – aksappy

回答

0

只有一个实例可以使用@Immediate范围为this answer提到补充说我使用@Singleton标注在我的资源类。您应该查看“相关问题”链接。有一些问题与立即线程的内存泄漏有关。看来问题已经解决。所以你应该确保使用最新版本来获得补丁。

链接的答案使用web.xml-less配置。但是,如果您想保留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> 
相关问题