我是使用 Java 进行 Web 开发的新手。
我正在开发一个 Web 服务,我为此选择了 REST/Jersey。
我想在服务启动时初始化一些东西并保留它们
服务的整个生命周期。
第一个问题:Jersey Servlet 的构造函数是做这件事的好地方吗?
基本上,我想做的是加载位于我的 WEB-INF 目录中的 config.ini 文件。
关注 this help , 我知道我需要 Servlet上下文 将我的文件加载为资源。
但是,我不清楚如何获得 Servlet上下文 在 Jersey Servlet 中,因为它实际上不是 servlet 的实例,而是带有一些注释的 POJO。
我想试试this tip ,但构造函数中的属性“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>";
}
}
任何帮助将非常感激。
提前致谢,
拉斐尔
最佳答案
使用 ContextListener 不是 JAX-RS 执行此操作的方法—— ContextListener 是 servlet API 中的“下一层”。
您可以将带注释的声明放在构造函数参数中,它将传递给构造函数:
public Servlet(@Context ServletContext context) {
正如您所发现的,在构造对象之后,对数据成员使用 @Context 注释会初始化该成员。
另一种方法是将 Config 对象的初始化移动到某种 init 调用中,并且仅在需要时对其进行初始化,即延迟初始化。然后 ServletContext 数据成员将已经由 Jersey 框架设置。
祝你好运!
柯克
关于rest - Jersey/ServletContext 和启动时的资源加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2942584/