6

我正在创建一个包装过时的供应商 API 的 RESTful Web 服务。将需要一些外部配置,这些配置将存储在服务器上的文件或 rdbms 中。我在 Glassfish 3.1.2 中使用 Jersey 1.11.1。此配置数据全部采用字符串键/值格式。

我的第一个问题是——我可以在 Jersey 中的哪里存储全局/实例变量,以便它们在请求之间持久存在并可供所有资源使用?如果这是一个纯 Servlet 应用程序,我将使用 ServletContext 来完成此操作。

问题的第二部分是泽西服务器加载后如何加载我的配置?同样,我的 Servlet 类比是找到与 init() 方法等效的方法。

4

2 回答 2

11

@Singleton @StartupEJB 符合您的要求。

@Singleton
@Startup // initialize at deployment time instead of first invocation
public class VendorConfiguration {

    @PostConstruct
    void loadConfiguration() {
        // do the startup initialization here
    }

    @Lock(LockType.READ) // To allow multiple threads to invoke this method
                         // simultaneusly
    public String getValue(String key) {
    }
}


@Path('/resource')
@Stateless
public class TheResource {
    @EJB
    VendorConfiguration configuration;
    // ...
}

编辑:根据格雷厄姆的评论添加注释

于 2013-05-12T07:39:54.617 回答
8

您可以使用侦听器来初始化变量并在 Web 应用程序启动之前将其设置为上下文作为属性,如下所示:

package org.paulvargas.shared;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class LoadConfigurationListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) {
        // read file or rdbms
        ...
        ServletContext context = sce.getServletContext();
        // set attributes
        ...
    }

    public void contextDestroyed(ServletContextEvent sce) {
        ServletContext context = sce.getServletContext();
        // remove attributes
        ...
    }

}

此侦听器在web.xml.

<listener>
    <listener-class>org.paulvargas.shared.LoadConfigurationListener</listener-class>
</listener>

您可以使用@Context注解来注入ServletContext和检索属性。

package org.paulvargas.example.helloworld;

import java.util.*;

import javax.servlet.ServletContext;
import javax.ws.rs.*;
import javax.ws.rs.core.*;

@Path("/world")
public class HelloWorld {

    @Context
    private ServletContext context;

    @GET
    @Produces("text/plain; charset=UTF-8")
    public String getGreeting() {

        // get attributes
        String someVar = (String) context.getAttribute("someName")

        return someVar + " says hello!";
    }

}
于 2013-05-12T04:20:58.267 回答