2017-09-22 17 views
-1

我需要訪問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://stackoverflow.com/a/12160863/1426227)。 –

回答

0

訣竅的方法是在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; 
    } 

    ... 
}