如何在Jersey / Glassfish中加载和存储全局变量

时间:2013-05-12 02:22:05

标签: glassfish jersey jax-rs

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

我的第一个问题是 - 在哪里可以在Jersey中存储全局/实例变量,以便它们可以在请求之间保留并可用于所有资源?如果这是一个纯粹的Servlet应用程序,我将使用ServletContext来实现这一目标。

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

2 个答案:

答案 0 :(得分:11)

@Singleton @Startup EJB符合您的要求。

@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;
    // ...
}

编辑:根据格雷厄姆的评论

添加了注释

答案 1 :(得分:8)

您可以使用listener初始化变量,并在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!";
    }

}