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

时间:2010-05-31 09:24:15

标签: rest resources jersey servlets

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

我想在启动服务时初始化一些东西并保留它们 一直以来的服务。

第一个问题: Jersey Servlet的构造函数是否适合这样做?

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

但是,我不清楚如何在 Jersey Servlet中获取 ServletContext ,因为它实际上不是servlet的实例,而是POJO带一些注释。 我想尝试this tip,但属性“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>";
    }
}

非常感谢任何帮助。 提前谢谢,

圣拉斐尔

2 个答案:

答案 0 :(得分:9)

使用ContextListener并不是JAX-RS的方法 - ContextListener是&#34;下一层,&#34;实际上,在servlet API中。

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

public Servlet(@Context ServletContext context) {

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

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

祝你好运!

柯克

答案 1 :(得分:7)

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

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

所以步骤是:

  1. 创建您的Listener类,实现contextInitialized(ServletContextEvent sce)方法。在此方法中,您将收到一个ServeltContextEvent,它具有getServletContext()方法,该方法允许您访问ServletContext。
  2. 在web.xml中配置监听器
  3. 您可以在此处找到其他信息:tutorial

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

    顺便说一下,如果你的文件在JAR文件中,我不确定ServletContext方法是加载它的最佳方法。我觉得你最喜欢的事情就像:

    this.getClass().getClassLoader().getResourceAsStream("com.company.my.file.properties");