如何在CDI生命周期之外注入ServletContext
问题描述:
我需要访问ServletContext以对我的WEB-INF目录中的某些文件使用getRealPath()方法。但是,我需要做的工作是非CDI类,它用于根据JAX-RS早期提出的请求进行一些后端处理。如何在JAX-RS请求的生命周期之外获取ServletContext?如何在CDI生命周期之外注入ServletContext
我使用Wildfly 10,如果改变了我会去这个
答
诀窍的方法是在Java EE应用程序的启动时加载一个servlet,见@WebServlet
注解。在容器启动时调用Servlet.init()
方法,我们将利用该方法与ServletContext
一起使用,在这种情况下调用getRealPath()
并将返回的值存储到静态变量中。您可以通过致电RealPathServlet.getRealPath()
访问应用程序其余部分的值。
@WebServlet(value="/real-path", loadOnStartup=1)
public class RealPathServlet extends HttpServlet {
private static String realPath;
public void init(ServletConfig config) throws ServletException {
super.init(config);
realPath = config.getServletContext().getRealPath("yolo");
Logger.getLogger(ContextPathServlet.class.getName()).info("Real path is " + realPath);
}
public static getRealPath() {
return realPath;
}
...
}
你是什么意思后端处理? EJB? – empyros
我真的不知道。这对我来说很新。 请求进入一个队列,稍后由一个单独的线程处理,REST调用返回200以表示它将在队列中。但是,在REST调用返回后,我需要另一个线程上的ServletContext在WAR的WEB-INF内的文件上执行从请求计划的操作。但是由于它在一个单独的线程上并且JAX-RS调用已经返回,因此ServletContext即使放入队列中也是空的。 – seanr8
'getRealPath()'是不可移植的,你不能使用它。看到这个[答案](https://stackoverflow.com/a/12160863/1426227)。 –