如何在CDI生命周期之外注入ServletContext

问题描述:

我需要访问ServletContext以对我的WEB-INF目录中的某些文件使用getRealPath()方法。但是,我需要做的工作是非CDI类,它用于根据JAX-RS早期提出的请求进行一些后端处理。如何在JAX-RS请求的生命周期之外获取ServletContext?如何在CDI生命周期之外注入ServletContext

我使用Wildfly 10,如果改变了我会去这个

+0

你是什么意思后端处理? EJB? – empyros

+0

我真的不知道。这对我来说很新。 请求进入一个队列,稍后由一个单独的线程处理,REST调用返回200以表示它将在队列中。但是,在REST调用返回后,我需要另一个线程上的ServletContext在WAR的WEB-INF内的文件上执行从请求计划的操作。但是由于它在一个单独的线程上并且JAX-RS调用已经返回,因此ServletContext即使放入队列中也是空的。 – seanr8

+0

'getRealPath()'是不可移植的,你不能使用它。看到这个[答案](https://*.com/a/12160863/1426227)。 –

诀窍的方法是在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; 
    } 

    ... 
}