启动时的Jersey/ServletContext和资源加载

Rap*_*vet 8 rest resources servlets jersey

我是使用Java进行Web开发的新手.我正在开发一个Web服务,我选择了REST/Jersey.

我想在启动服务时初始化一些东西,并在服务的整个生命周期中保留它们.

第一个问题:Jersey Servlet 的构造函数是一个好的地方吗?

基本上,我想要做的是加载位于我的WEB-INF目录中的config.ini文件.在这个帮助之后,我理解我需要一个ServletContext来加载我的文件作为资源.

但是,我不清楚如何在Jersey Servlet中获取这个ServletContext,因为它实际上不是servlet的实例,而是带有一些注释的POJO.我想尝试这个技巧,但构造函数中的属性"context"为null.我认为Jersey可能会在构造函数之后填充它.对 ?

那么如何正确地做到这一点呢?

到目前为止,这是我的代码:

/** Main REST servlet */
@Path("/")
public class Servlet {

    // ---------------------------------------------------- 
    // Constants                     
    // ---------------------------------------------------- 

    static private final String CONFIG_PATH = "/WEB-INF/config.ini";

    // ---------------------------------------------------- 
    // Attributes                     
    // ---------------------------------------------------- 

    /** Context */
    @Context ServletContext context;

    // ---------------------------------------------------- 
    // Constructor                     
    // ---------------------------------------------------- 

    /** Init the servlet */
    public Servlet() {

        // Load config.ini from WEB-INF
        Config.config = new Config(
                this.context.getResourceAsStream(CONFIG_PATH));

        // FAIL! this.context is null ...

    }

    // ---------------------------------------------------- 
    // URI Handlers                    
    // ---------------------------------------------------- 

    /** Welcome page */
    @GET
    @Path("/")
    @Produces(MediaType.TEXT_HTML)
    public String welcome() {
        return "<h1>Hi there.</h1>";
    }
}
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激.提前致谢,

拉斐尔

小智 9

使用ContextListener不是JAX-RS的方法 - ContextListener是servlet API中的"下一层".

您可以将带注释的声明放在构造函数参数中,然后将其传递给构造函数:

public Servlet(@Context ServletContext context) {
Run Code Online (Sandbox Code Playgroud)

正如您所发现的那样,在构造对象之后,对数据成员使用@Context注释初始化该成员.

另一种方法是将Config对象的初始化移动到某种类型的init调用中,并且只在需要时初始化它,即延迟初始化.然后,ServletContext数据成员已经由Jersey框架设置.

祝好运!

柯克


Pie*_*nry 7

我不熟悉Jersey,但通常在Java Web应用程序中,我认为正确的做法是创建ContextListener.

上下文侦听器是一个实现接口javax.servlet.ServletContextListener并在web.xml中配置的类.它有一个方法,当应用程序第一次被装入容器时执行,另一个方法在应用程序停止时执行,因此它是放置一些一次性初始化内容和清理之前的理想位置.应用程序已停止.

所以步骤是:

  1. 创建您的Listener类,实现contextInitialized(ServletContextEvent sce)方法.在此方法中,您将收到一个ServeltContextEvent,它具有getServletContext()方法,该方法允许您访问ServletContext.
  2. 在web.xml中配置监听器

你会在这里找到更多信息:教程

或者在Sun的,呃,Oracle的网站上.

顺便说一句,如果你的文件将在一个JAR文件中,我不确定ServletContext方法是加载它的最佳方法.我认为你最喜欢的事情就像:

this.getClass().getClassLoader().getResourceAsStream("com.company.my.file.properties");
Run Code Online (Sandbox Code Playgroud)