9

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

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

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

基本上,我想做的是加载位于我的 WEB-INF 目录中的 config.ini 文件。按照这个帮助,我知道我需要一个ServletContext来将我的文件作为资源加载。

但是,我不清楚如何在Jersey Servlet 中获取此ServletContext,因为它实际上并不是 servlet 的实例,而是带有一些注释的 POJO。我想试试这个技巧,但构造函数中的属性“context”为空。我认为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>";
    }
}

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

拉斐尔

4

2 回答 2

9

使用 ContextListener 不是 JAX-RS 执行此操作的方法—— ContextListener 是 servlet API 中的“下一层”。

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

public Servlet(@Context ServletContext context) {

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

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

祝你好运!

柯克

于 2012-04-25T17:34:28.217 回答
7

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

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

所以步骤是:

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

您可以在此处找到更多信息:教程

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

顺便说一句,如果您的文件位于 JAR 文件中,我不确定 ServletContext 方法是否是加载它的最佳方式。我认为您最好使用以下内容:

this.getClass().getClassLoader().getResourceAsStream("com.company.my.file.properties");
于 2010-05-31T09:48:27.820 回答