【问题标题】:How to inject a ServletContext outside of CDI lifecycle如何在 CDI 生命周期之外注入 ServletContext
【发布时间】:2018-03-04 06:08:27
【问题描述】:

我需要访问 ServletContext 才能对我的 WEB-INF 目录中的某些文件使用 getRealPath() 方法。但是,我需要在其中完成这项工作的类是一个非 CDI 类,该类用于基于先前从 JAX-RS 发出的请求进行一些后端处理。如何在 JAX-RS 请求的生命周期之外获取 ServletContext?

我正在使用 Wildfly 10,如果这改变了我的处理方式

【问题讨论】:

  • 后端处理是什么意思? Ejb?
  • 我真的不知道。这对我来说很新鲜。请求进入队列,稍后由单独的线程处理,REST 调用仅返回 200 表示它将在队列中。但是我需要另一个线程上的 ServletContext,在 REST 调用返回后,执行从 WAR 的 WEB-INF 内的文件的请求中安排的操作。但是由于它在一个单独的线程上并且 JAX-RS 调用已经返回,所以 ServletContext,即使它也被放入了队列中,现在也是 null。
  • getRealPath() 是不可移植的,你不能使用它。看到这个answer

标签: java jax-rs wildfly


【解决方案1】:

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

    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    相关资源
    最近更新 更多