我正在创建一个包含过时的供应商API的RESTful Web服务。将需要一些外部配置,并将其存储在服务器上的文件或rdbms中。我在Glassfish 3.1.2中使用Jersey 1.11.1。此配置数据全部采用字符串键/值格式。
我的第一个问题是 - 在哪里可以在Jersey中存储全局/实例变量,以便它们可以在请求之间保留并可用于所有资源?如果这是一个纯粹的Servlet应用程序,我将使用ServletContext来实现这一目标。
问题的第二部分是如何在加载Jersey服务器后加载我的配置?同样,我的Servlet类比将是找到与init()方法等效的东西。
答案 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!";
}
}